3

私はコードをもっている

module Main where

import Text.Printf

main = printf "%s%s" ("Content-type: text/html; charset=utf-8\n\n" :: String ) ("And немного русского" :: String)

そして、ターミナルで実行すると、必要なものが得られます。

Content-type: text/html; charset=utf-8

And немного русского

しかし、それをcgi-programとして実行しようとすると、ちょうどAnd(この単語の後にキリル文字があり、それらは表示されたくないため)です。

putStr $ fromStringfromData.ByteString.Char8とを使用しても問題はData.ByteString.UTF8ないので、LAMPPサーバーに問題はないと思います。そして私もAddDefaultCharset utf-8httpd.confに含めました。

そして、まさに私がやりたいのは%s%dなどの特別な記号を含むテンプレートファイルを読み取り、printfクエリ文字列と表示に応じて、それら(記号)を必要なものに置き換えることです。

私はただ楽しみのためにそれをします、そして私はこの問題が純粋なHaskellでのみ解決されることを望みます。

4

2 に答える 2

7

CGIプログラムをロケールに依存させることが適切な場合と適切でない場合があります。たとえば、生成されたHTMLにUTF-8であるというエンコーディングヘッダーがある場合は、システムロケールとは関係なくUTF-8を生成する必要があります。

ロケールに依存しない方法は、stdoutに何かを出力する前に、stdoutのエンコーディングを設定することです。

import System.IO

main = do
    hSetEncoding stdout utf8
    printf "%s%s" ("Content-type: text/html; charset=utf-8\n\n" :: String ) ("And немного русского" :: String)

あなたのコード:

/tmp $ echo $LANG
de_DE.utf8
/tmp $ ./Test2
Content-type: text/html; charset=utf-8

And немного русского
/tmp $ LANG=C ./Test2 
Content-type: text/html; charset=utf-8

And Test2: <stdout>: commitBuffer: invalid argument (invalid character)

変更されたコード:

/tmp $ ./Test2
Content-type: text/html; charset=utf-8

And немного русского
/tmp $ LANG=C ./Test2 
Content-type: text/html; charset=utf-8

And немного русского
于 2012-07-24T09:15:39.360 に答える
0

SetEnv LANG en_US.UTF-8非常に良い解決策は、これらのファイルの1つに文字列を入れて、httpd.conf、.htaccess、またはhttpd-vhosts.conf(LAMPP内)に環境変数LANGを設定することです。

httpd.confでは、この変数をすべてのサーバーに設定できます。

.htaccessファイルで設定するには、vhosts.confでこの機会を有効にする必要があります

<Directory "<.htaccess directory>">
    AllowOverride All
</Directory>

そして、SetEnvを使用して、setディレクトリ内の.htaccessファイルで変数を変更できるようになります。

vhosts.confでは、ブロックSetEnv LANG en_US.UTF-8内に文字列を追加するだけです。VirtualHost

このソリューションを使用すると、Data.ByteString.Char8などのライブラリなしでUTF-8などを使用できます。

そしてまたありがとうnm!

于 2016-08-15T07:10:39.650 に答える