StringBuffer类和中文字符编码

时间:2014-05-13 14:07:16

标签: java string encoding stringbuffer chinese-locale

我编写了一个返回包含中文字符的字符串的方法。

public printChineseMenu(){
   StringBuffer buffer;
   buffer.append(chinese string returned from DB);     //chinese characters appear in SQL
   System.out.println(buffer);                         //they appear as question marks
   PrintStream out = new PrintStream(System.out, true, "UTF-8");
   out.println(buffer);                                //chinese characters appear

   return (buffer.toString())
}

是否存在比StringBuffer类

更好的存储/返回中文字符串的类型

2 个答案:

答案 0 :(得分:4)

此处的问题不是StringBuffer - 它只是System.out使用的编码。在不使用StringBuffer的情况下直接打印字符串时,您会发现完全相同的行为。

StringBuffer(及其更现代,非线程安全的等效,StringBuilder,你应该使用它)不关心编码本身 - 他们只使用UTF序列 - 16个代码单元。它们将正确保留所有Unicode数据。 String也是如此。

您的方法几乎肯定会返回String - 但如果您不需要做任何"构建"使用字符串(附加其他部分),然后使用StringBufferStringBuilder没有任何意义。如果你需要从多个字符串构建reslut字符串,你可以使用它们中的任何一个,并且只返回toString()的结果,就像你已经在做的那样(尽管返回值周围的括号无关紧要; return不是方法)。

对于字符串数据,控制台通常会产生误导。如有疑问,请一次打印一个UTF-16代码单元序列,然后找出其意义。这样就没有编码或不可打印字符成为问题的危险。

答案 1 :(得分:3)

您最好的选择是返回一个字符串。这是因为String是不可变的,并且可以存储比单个字符更多的信息。

当您打印文本时,您需要确保使用与尝试读取的预期相同的编码来编写数据。例如,如果您将输出重定向到文件并且您的阅读器需要UTF-8编码,那就是您编写它的方式。

System.out单独使用的问题是它不会写char,而是会写byte并假设编码可能不是您需要的。< / p>