8并将eclipse设置为utf-8之后,字符串显示问题

x6yk4ghg  于 2021-07-08  发布在  Java
关注(0)|答案(2)|浏览(317)

为了适应新的测试工具,我不得不将所有java源文件转换为utf-8(主要来自windows1252或iso-8859-1),并将eclipse配置更改为默认使用utf-8。但是转换导致了一些包含重音符号的字符串出现问题。
这些字符串从数据库(nls\u characterset:we8mswin1252)读取,然后使用套接字发送到delphi程序。数据库和delphi程序都没有被修改。
使用以下方法从数据库检索字符串:

ArrayList<String> menus = new ArrayList<String>(); 
String query = "SELECT ITEM FROM menus ...";
psmt = con.prepareStatement( query );
rs = psmt.executeQuery();
while( rs.next() ) {
    if( rs.getString( "ITEM" ) == null ) continue;
    String s = rs.getString( "ITEM" );
    menus.add( s );
}
return menus;

然后使用套接字和printwriter将它们发送到另一个程序

Socket socket = new Socket( getTcpIPAddress(), getTcpCommandPort() );
PrintWriter pred = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())), true);

String str = "ADD:";
str = str.concat( menus.get( 0 ) );
pred.println(str);

我尝试了许多不同的转换来创建要发送的字符串,但仍然得到奇怪的字符而不是重音符号

String s = rs.getString( "ITEM" );
String m1 = new String( s.getBytes("UTF-8") );
String m2 = new String( s.getBytes("UTF-8"), "ISO-8859-1" );
String m3 = new String( s.getBytes("ISO-8859-1") );
String m4 = new String( s.getBytes("ISO-8859-1"), "UTF-8" );
String m5 = new String( s.getBytes(), "ISO-8859-1" );
String m6 = new String( s.getBytes(), "UTF-8" );

byte[] ba = rs.getBytes( "ITEM" );
String b1 = new String( ba ); 
String b2 = new String( ba, "ISO-8859-1" ); 
String b3 = new String( ba, "UTF-8" ); 
String b4 = new String( ba, "windows-1252" ); 
String b5 = new String( ba, "US-ASCII" );

除了转换源文件和重置eclipse的默认配置之外,你知道如何恢复我的口音吗?

8oomwypt

8oomwypt1#

编码总是在位和字符之间进行转换时起作用。这个 #getBytes() 调用本身根据平台的运行时默认字符集将字符串中的字符转换为位。有不同版本的 #getBytes() 使用字符集信息来避免这种情况。您应该在那里指定一个字符集,以及在示例化 OutputStreamWriter ,以避免这些意外更改。

qhhrdooz

qhhrdooz2#

罪魁祸首是eclipse配置,尽管我不明白为什么。
在window->preferences,general->workspace->“文本文件编码”中将选项设置回默认值(cp1252)解决了这个问题。

相关问题