为了适应新的测试工具,我不得不将所有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的默认配置之外,你知道如何恢复我的口音吗?
2条答案
按热度按时间8oomwypt1#
编码总是在位和字符之间进行转换时起作用。这个
#getBytes()
调用本身根据平台的运行时默认字符集将字符串中的字符转换为位。有不同版本的#getBytes()
使用字符集信息来避免这种情况。您应该在那里指定一个字符集,以及在示例化OutputStreamWriter
,以避免这些意外更改。qhhrdooz2#
罪魁祸首是eclipse配置,尽管我不明白为什么。
在window->preferences,general->workspace->“文本文件编码”中将选项设置回默认值(cp1252)解决了这个问题。