2012-01-22 11 views
2

マルチキャラクタデータをデータベースに保存して問題をデバッグしようとすると、Groovyが文字列をどのように処理しているかという問題が絞り込まれました。 は、私はこのコードのスニペットを持っている:Groovyがユニコード文字列を出力する方法を理解できない

println "Hi!" 
def strings=[ 
"Dies ist eine Testlinie in deutscher Sprache.", 
"C'est une ligne d'essai en français.", 
"Is é seo an líne tástála i nGaeilge..", 
"Esta é unha liña de proba en galego.", 
"Questa è una linea di prova in italiano.", 
"Dette er en test linje i norsk.", 
"Þetta er próf lína í íslensku.", 
"Góðan dag, hvernig ert þú að gera?", 
"Ich komme aus Köln" 
] 
strings.each { 
    println it 
} 

私はgroovyコンソールに私のブラウザから行をコピーし、このスニペットを救いました。

私はとWindowsのコマンドラインで実行した場合:

groovy testAnsi.groovy 

私が手:

Hi! 
Dies ist eine Testlinie in deutscher Sprache. 
C'est une ligne d'essai en franτais. 
Is Θ seo an lφne tßstßla i nGaeilge.. 
Esta Θ unha li±a de proba en galego. 
Questa Φ una linea di prova in italiano. 
Dette er en test linje i norsk. 
▐etta er pr≤f lφna φ φslensku. 
G≤≡an dag, hvernig ert ■· a≡ gera? 
Ich komme aus K÷ln 

私はメモ帳++でファイルを開くと、それはそれはANSIで書かれて言いますと、たくさんのを示しています奇妙な文字。 メモ帳で開くと、ANSIで書かれており、適切な文字が表示されます。私はその後、ユニコードでメモ帳でファイルを保存する場合

(それはメモ帳内のすべての適切な文字をUC2リトルエンディアン++として表示)、およびなどのコマンドラインで実行します:私はこれを取得

groovy -c UTF-16 testUnicode.groovy 

Hi! 
Dies ist eine Testlinie in deutscher Sprache. 
C'est une ligne d'essai en franτais. 
Is Θ seo an lφne tßstßla i nGaeilge.. 
Esta Θ unha li±a de proba en galego. 
Questa Φ una linea di prova in italiano. 
Dette er en test linje i norsk. 
▐etta er pr≤f lφna φ φslensku. 
G≤≡an dag, hvernig ert ■· a≡ gera? 
Ich komme aus K÷ln 

しかし、私はgroovyコンソール内ANSIまたはUnicodeのファイルのいずれかを実行したとき、私は、出力パネルで期待どおりの結果を得ることができます。

私がしなければ今、:

more testAnsi.groovy 

私はスクリプトを実行するかどう私が手に同じちんぷんかんぷんを取得します。

私が行う場合:

more testUnicode.groovy 

は私がアイスランドのものを除いて、適切な文字を取得します。

Linuxのボックスでコードを実行すると同じ結果が得られますが、catを使用してソースファイルの内容を表示すると、常に適切な文字が表示されます。

私は困惑しています。明らかに私は何か間違っているが、私は何が分からない。

ファイル内にあるように、文字列に含まれる文字をGroovyに出力させるにはどうすればよいですか?

答えて

4

GroovyはJavaデフォルト文字セットで出力しています。これは、プラットフォームによってはcode page 1252(西ヨーロッパの "ANSI")です。ただし、結果はcode page 437の古いDOS "OEM"コードページに表示されています。

次のように入力することで、この問題を解決できる場合があります。

chcp 1252 

をコマンドプロンプトでのGroovyを実行する前に。もちろん、プログラムの出力はそのコードページに収まる必要がありますので、あなたの例では西ヨーロッパのアクセントを使用できますが、他のアルファベットを書くことはできません。

ユニコードの動作をテストするには、ペストのようなWindowsのコマンドプロンプトを避けることをお勧めします。

+0

ありがとうございます。それは多くの意味を持ち、画面の動作を説明します。なぜ私は画面に出力するのではなく、データベースに出力しようとすると、同じ結果が得られますか?私はOracle 10gに書き込み、NLS_LANG = AMERICAN_AMERICA.UTF8を設定し、Oracleドライバのスイッチを使用してすべての文字列をUTF-8として処理しますが、書き込まれたデータにも同様の問題があります。 – GVdP

+0

同じ回答:あなたのデータベースをプレビューしているうちに、表示用のアプリケーションが間違ったコードを処理している可能性があります... – fixitagain

関連する問題