2011-11-09 22 views
15

補足的なUnicode文字(たとえば、codepoint 10400)を文字列リテラルに入れるにはどうすればいいですか? 私はこのようなサロゲートペアを入れて試してみました:補足的なUnicode文字を文字列リテラルに入れる方法は?

String text = "TEST \uD801\uDC00"; 
System.out.println(text); 

動作するようには思えません。

更新日:

良いニュースは、文字列が正しく構築されていることです。 UTF-8で
バイトアレイ:54 45 53 54 20 F0 UTF-16 90 90 80
バイト配列:FE、FF 0 54 0 45 0 53 0 54 0 20 D8 1直流0

悪いですニュースは、(私のFedoraボックスで)正しく印刷されず、予想されたシンボルの代わりに正方形が見えます(私のコンソールはユニコードを適切にサポートしていませんでした)。

+2

あなたは動作するようには思えないと言うとき、あなたは何を意味するのですか? 'text.charAt(5)'の値は何ですか? – Mats

+0

シンボルを正しく印刷しません。それは出力ストリームで何かになる可能性があります。 – n0rm1e

+0

私は、「小さな箱」は、システムが表示できない文字を表すために使用されると信じています。これは単に、出力を表示しようとしているディスプレイでディスプレイに使用されているフォントが、その文字のグリフを提供していないことを意味します。 – neuralmer

答えて

12

「Works for me」、どういう問題がありますか?

public static void main (String[] args) throws Exception { 
    int cp = 0x10400; 
    String text = "test \uD801\uDC00"; 
    System.out.println("cp: " + cp); 
    System.out.println("found: " + text.codePointAt(5)); 
    System.out.println("len: " + text.length()); 
} 

出力:

cp: 66560 
found: 66560 
len: 7 

なお、長さ - ほとんどの文字列の方法のように - char秒、ないのUnicode文字を扱います。すごくユニコードサポートのために多くの:

ハッピーコーディング。

+0

'cp:66560' ' found:66560' –

+0

ありがとうございます。出力ストリームに何か問題があるようです。なぜなら、text.getBytes()から得られるバイトは正しいからです。 – n0rm1e

+2

@ houman001 * *常に* - 私は今知っている場合を除いて); - 'getBytes'でエンコーディングを指定する:)この文字列を"プラットフォームのデフォルトの文字セット** " 'new String(byte [])'の場合も同様です。正しいエンコーディングが使用されている(指定されているかそうでない場合)場合、ストリームに送信される出力は正しいはずですが、相手側のプログラム(または端末)が一致しない可能性があります。 –

4

は、使用して動作するようになっている:

System.out.println(
    "text = " + new String(Character.toChars(h)) 
); 

をしかし出力は、次のとおりです。

text = ? 
+2

hが正しいと仮定すると、 'System。データをシステムのデフォルト文字セットに符号化する(これは損失のある変換でもよい)。あなたが書いているデバイスは同じ文字セットを使う必要があります(必ずしもそうであるとは限りません)。デバイスに表示する書記素のフォントサポートが必要です。 – McDowell

+3

Windowsのコンソールについて言えば、Javaのようにstdio関数を使ってアクセスすると、それは壊れてしまい、ANSIコードページ外の文字にも対処できません(アストラルプレーンズの文字はもちろんですが) 。 – bobince

関連する問題