Java 读取unicode

Java 读取unicode,java,unicode,Java,Unicode,我正在使用JavaIO从服务器检索文本,该服务器可能会输出字符,如é。 然后使用System.err输出,结果是“?”。我使用UTF8编码。怎么了? int len=0 char[] buffer = new char[1024]; OutputStream os = sock.getOutputStream(); InputStream is = sock.getInputStream(); os.write(query.getBytes("UTF8"));//iso8859_1")); R

我正在使用JavaIO从服务器检索文本,该服务器可能会输出字符,如é。 然后使用System.err输出,结果是“?”。我使用UTF8编码。怎么了? int len=0

char[] buffer = new char[1024];
OutputStream os = sock.getOutputStream();
InputStream is = sock.getInputStream();
os.write(query.getBytes("UTF8"));//iso8859_1"));

Reader reader = new InputStreamReader(is, Charset.forName("UTF-8"));
do {
    len = reader.read(buffer);
    if (len > 0) {
        if (outstring == null) {
            outstring = new StringBuffer();
        }
        outstring.append(buffer, 0, len);
    }
} while (len > 0);
System.err.println(outstring);
编辑:刚刚尝试了以下代码:

StringBuffer b = new StringBuffer();
for (char c = 'a'; c < 'd'; c++) {
    b.append(c);
}
b.append('\u00a5'); // Japanese Yen symbol
b.append('\u01FC'); // Roman AE with acute accent
b.append('\u0391'); // GREEK Capital Alpha
b.append('\u03A9'); // GREEK Capital Omega

for (int i = 0; i < b.length(); i++) {
    System.out.println("Character #" + i + " is " + b.charAt(i));
}
System.out.println("Accumulated characters are " + b);
StringBuffer b=新的StringBuffer();
for(字符c='a';c<'d';c++){
b、 附加(c);
}
b、 附加('\u00a5');//日元符号
b、 追加('\u01FC');//带有尖锐口音的古罗马口音
b、 追加('\u0391');//希腊首都阿尔法
b、 附加('\u03A9');//希腊首都欧米茄
对于(int i=0;i
结果也变成了垃圾:

Character #0 is a Character #1 is b Character #2 is c Character #3 is ¥ Character #4 is ? Character #5 is ? Character #6 is ? Accumulated characters are abc¥??? 字符#0是一个 字符#1是b 字符#2是c 字符#3为¥ 第四个角色是什么? 五号人物是谁? 六号人物是谁? 累计字符为abc¥???
将此文件写入一个文件,并检查它是如何产生的。若它正确地出现在文件中,那个么就是错误流的问题(编码不是UTF-8)。如果在您的服务器编码中也有垃圾字符,则可能不是UTF-8。

首先,验证系统属性(file.encoding)实际上是UTF8。如果是,那么问题不是您正在运行的代码,而是您的终端程序(或其他输出显示)无法正确呈现输出。

您的第二个示例为我生成了以下输出

Character #0 is a Character #1 is b Character #2 is c Character #3 is ¥ Character #4 is Ǽ Character #5 is Α Character #6 is Ω Accumulated characters are abc¥ǼΑΩ 字符#0是一个 字符#1是b 字符#2是c 字符#3为¥ 第四个字是 字符#5是Α 字符#6为Ω 累计字符为abc¥Ω 此代码生成具有相同内容的正确编码的UTF-8文件

StringBuilder b = new StringBuilder();
for (char c = 'a'; c < 'd'; c++) {
    b.append(c);
}
b.append('\u00a5'); // Japanese Yen symbol
b.append('\u01FC'); // Roman AE with acute accent
b.append('\u0391'); // GREEK Capital Alpha
b.append('\u03A9'); // GREEK Capital Omega

PrintStream out = new PrintStream("temp.txt", "UTF-8");
for (int i = 0; i < b.length(); i++) {
    out.println("Character #" + i + " is " + b.charAt(i));
}
out.println("Accumulated characters are " + b);
StringBuilder b=新的StringBuilder();
for(字符c='a';c<'d';c++){
b、 附加(c);
}
b、 附加('\u00a5');//日元符号
b、 追加('\u01FC');//带有尖锐口音的古罗马口音
b、 追加('\u0391');//希腊首都阿尔法
b、 附加('\u03A9');//希腊首都欧米茄
PrintStream out=新的PrintStream(“临时txt”、“UTF-8”);
对于(int i=0;i

另请参见:

该文件的输出是相同的,但其他参考程序读取并显示unicode字符很好(我没有该程序的源代码),我在eclipse中将编码更改为UTF-8,并正确运行新添加的代码。。。请以这种方式检查。重新格式化的代码;如果不正确,请还原。尽管与问题无关,但在此用法中首选
StringBuilder