现在问题的关键是如何把这些4字节编码的汉字转成2字节的Unicode或GB码。
我做了个试验,在SQLServer中新建了一个nvarchar字段,然后用Delphi程序把字符串'欧式平头按摩花洒头+插座组[泰式]'写入,用
select convert(varbinary(4000), field_name) from table_name
看到存储内码是:0x276B0F5F735E345909636964B182126D34592B00D263A75EC47E5B00F06C0F5F5D00
这是正常的2字节Unicode。
在Delphi的Debug中,Hint显示:
FieldByName('Name').value = ''s4i?4+咬腫?]' //乱码
Hint显示: FieldByName('Name').AsString = '欧式平头按摩花洒头+插座组[泰式]' //正常
就是说,正常的Unicode用FieldByName('Name').AsString可以自动转换,FieldByName('Name').value的Variant类型是VarOleStr,在TVarData(v).VOleStr中存储的就是'欧式平头按摩花洒头+插座组[泰式]';
而对于4字节存储的字段,在Delphi的Debug中,Hint显示:
FieldByName('Name').value = '欧式平头按摩花洒头+插座组[泰式]' //正常
FieldByName('Name').AsString = '?·ê???í·°′?|?¨è÷í·+2?×ù×é[ì?ê?]' //乱码
FieldByName('Name').value的Variant类型也是VarOleStr,在TVarData(v).VOleStr中存储的是'?·ê???í·°′?|?¨è÷í·+2?×ù×é[ì?ê?]'
请熟悉字符集编码或Delphi源码的朋友指教!