java – StringBuffer类和中文字符编码

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

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类更好的存储/返回中文字符串的类型

解决方法

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

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

你的方法几乎肯定只返回一个String – 但如果你不需要用字符串做任何“构建”(附加其他部分),那么使用StringBuffer或StringBuilder就没有意义了.如果你确实需要从多个字符串构建reslut字符串,你可以使用它们中的任何一个,并且只返回你已经在做的toString()的结果(尽管返回值周围的括号是无关紧要的;返回不是一种方法).

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

相关文章

HashMap是Java中最常用的集合类框架,也是Java语言中非常典型...
在EffectiveJava中的第 36条中建议 用 EnumSet 替代位字段,...
介绍 注解是JDK1.5版本开始引入的一个特性,用于对代码进行说...
介绍 LinkedList同时实现了List接口和Deque接口,也就是说它...
介绍 TreeSet和TreeMap在Java里有着相同的实现,前者仅仅是对...
HashMap为什么线程不安全 put的不安全 由于多线程对HashMap进...