10 个解决方案
#1
首先要确定是数据库字符集为AMERICAN_AMERICA.us7ascii还是客户端NLS_LANG设置为AMERICAN_AMERICA.us7ascii,如果是后者,这个设置只决定显示,不影响数据库中的实际存储,可以改,不改也可以用rawtohex函数获取原始编码的数据:select rawtohex(xxx) from ...。
如果是前者(用sqlplus客户端工具连接数据库,输入select * from nls_database_parameters;看看输出),那就比较麻烦了,US7ASCII是7位ASCII编码,最高位是0,所以中文存进去的时候就信息丢失了,读出来也不可能正确。只能写入之前先编码,比如BASE64,读出来之后再解码。
如果是前者(用sqlplus客户端工具连接数据库,输入select * from nls_database_parameters;看看输出),那就比较麻烦了,US7ASCII是7位ASCII编码,最高位是0,所以中文存进去的时候就信息丢失了,读出来也不可能正确。只能写入之前先编码,比如BASE64,读出来之后再解码。
#2
您好,非常感谢2楼的回复,服务器数据库字符集就是AMERICAN_AMERICA.us7ascii,这个是确定的,我在客户端的机器里设置环境变量NLS_LANG为SIMPLIFIED CHINESE_CHINA.US7ASCII后,通过PLSQL查询是可以显示中文了,但通过delphi不知道如何转换,中文读取出来都是乱码
#3
那你把NLS_LANG为SIMPLIFIED CHINESE_CHINA.UTF8,D7读出来UTF8Decode再显示。
#4
好的,我试试看
#5
edit2.text:=Utf8Decode(YlQuery_Data['payer']); 还是乱码,我用的数据连接组件是unidac ,我这里设置 UniConnOracle.SpecificOptions.Values['Charset'] := 'SIMPLIFIED CHINESE_CHINA.UTF8'; 还是不行,
#6
那应该就是数据写入数据库时就丢失信息了,你只能先用兼容US7ASCII的编码比如BASE64先编码再写入,读取后先解码再显示。
#7
但是通过plsql连接,直接查询是可以显示中文的,问了他们开发商说他们显示也是没问题,我们只能读取他们的数据
#8
那你别用D7了,换D2009+支持unicode的版本。
#9
喔喔,我看看,不管怎样,非常感谢您
#10
这样啊,那你可以用rawtohex函数获取数据编码看看,和已知数据比较一下。
#1
首先要确定是数据库字符集为AMERICAN_AMERICA.us7ascii还是客户端NLS_LANG设置为AMERICAN_AMERICA.us7ascii,如果是后者,这个设置只决定显示,不影响数据库中的实际存储,可以改,不改也可以用rawtohex函数获取原始编码的数据:select rawtohex(xxx) from ...。
如果是前者(用sqlplus客户端工具连接数据库,输入select * from nls_database_parameters;看看输出),那就比较麻烦了,US7ASCII是7位ASCII编码,最高位是0,所以中文存进去的时候就信息丢失了,读出来也不可能正确。只能写入之前先编码,比如BASE64,读出来之后再解码。
如果是前者(用sqlplus客户端工具连接数据库,输入select * from nls_database_parameters;看看输出),那就比较麻烦了,US7ASCII是7位ASCII编码,最高位是0,所以中文存进去的时候就信息丢失了,读出来也不可能正确。只能写入之前先编码,比如BASE64,读出来之后再解码。
#2
您好,非常感谢2楼的回复,服务器数据库字符集就是AMERICAN_AMERICA.us7ascii,这个是确定的,我在客户端的机器里设置环境变量NLS_LANG为SIMPLIFIED CHINESE_CHINA.US7ASCII后,通过PLSQL查询是可以显示中文了,但通过delphi不知道如何转换,中文读取出来都是乱码
#3
那你把NLS_LANG为SIMPLIFIED CHINESE_CHINA.UTF8,D7读出来UTF8Decode再显示。
#4
好的,我试试看
#5
edit2.text:=Utf8Decode(YlQuery_Data['payer']); 还是乱码,我用的数据连接组件是unidac ,我这里设置 UniConnOracle.SpecificOptions.Values['Charset'] := 'SIMPLIFIED CHINESE_CHINA.UTF8'; 还是不行,
#6
那应该就是数据写入数据库时就丢失信息了,你只能先用兼容US7ASCII的编码比如BASE64先编码再写入,读取后先解码再显示。
#7
但是通过plsql连接,直接查询是可以显示中文的,问了他们开发商说他们显示也是没问题,我们只能读取他们的数据
#8
那你别用D7了,换D2009+支持unicode的版本。
#9
喔喔,我看看,不管怎样,非常感谢您
#10
这样啊,那你可以用rawtohex函数获取数据编码看看,和已知数据比较一下。