我编写了一个返回包含中文字符的字符串的方法。
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类
更好的存储/返回中文字符串的类型答案 0 :(得分:4)
此处的问题不是StringBuffer
- 它只是System.out
使用的编码。在不使用StringBuffer
的情况下直接打印字符串时,您会发现完全相同的行为。
StringBuffer
(及其更现代,非线程安全的等效,StringBuilder
,你应该使用它)不关心编码本身 - 他们只使用UTF序列 - 16个代码单元。它们将正确保留所有Unicode数据。 String
也是如此。
您的方法几乎肯定会返回String
- 但如果您不需要做任何"构建"使用字符串(附加其他部分),然后使用StringBuffer
或StringBuilder
没有任何意义。如果你做需要从多个字符串构建reslut字符串,你可以使用它们中的任何一个,并且只返回toString()
的结果,就像你已经在做的那样(尽管返回值周围的括号无关紧要; return
不是方法)。
对于字符串数据,控制台通常会产生误导。如有疑问,请一次打印一个UTF-16代码单元序列,然后找出其意义。这样就没有编码或不可打印字符成为问题的危险。
答案 1 :(得分:3)
您最好的选择是返回一个字符串。这是因为String
是不可变的,并且可以存储比单个字符更多的信息。
当您打印文本时,您需要确保使用与尝试读取的预期相同的编码来编写数据。例如,如果您将输出重定向到文件并且您的阅读器需要UTF-8编码,那就是您编写它的方式。
System.out
单独使用的问题是它不会写char
,而是会写byte
并假设编码可能不是您需要的。< / p>