在TStringList中转换特殊字符

3
我正在使用Delphi 7,并且有一个程序,可以将一系列记录的csv文件导入。这是通过将其加载到TStringList中进行的,方法是MyStringList.LoadFromFile(csvfile),然后使用line = MyStringList [i]获取每行。

这一直很顺利,但我现在发现特殊字符不能正确识别。例如,Rue François Coppée变成了Rue François Coppà © e - 重音的法语字符是问题所在。
是否有简单的方法来解决这个问题?
2个回答

4
你的文件采用UTF-8编码。例如考虑一下ç。从链接中可以看出,它在UTF-8中被编码为0xC3 0xA7。而在Windows-1252中,0xC3编码为Ã,0xA7编码为§
你能否轻松处理这个问题取决于你的ANSI Delphi所运行的当前代码页。
- 如果你使用的是Windows 1252,则没问题。你只需要调用UTF8Decode解码UTF-8编码的文本即可。 - 如果你使用的是其他语言环境,则情况会更加困难。那些字符可能不存在于您语言环境的字符集中,在这种情况下,您无法在Delphi的string变量中表示它们,因为该变量是使用当前ANSI字符集进行编码的。如果是这种情况,则需要使用Unicode。
如果你关心处理国际化文本,那么你需要:
- 升级到具有Unicode支持的现代Delphi版本 - 或者坚持使用Delphi 7并使用WideString和TNT Unicode组件。

谢谢。是的,UTF8Decode 起作用了,而不是 UTF8Encode。 - user3173083
你需要更多的帮助吗? - David Heffernan

1

可能它不是UTF8编码。尝试转换一下:

Text := UTF8Encode(Text);

敬礼,

谢谢回复。我尝试了那个方法,但实际上它让情况变得更糟,因为它最终变成了Rue François Coppée。我很确定它一开始就是UTF8编码的,所以我很困惑发生了什么事情。 - user3173083
1
在Notepad++上打开文件,检查菜单格式,它将显示实际编码。 - Rodrigo Farias Rezino
2
文本已经以UTF-8编码。再次编码是错误的。你需要使用UTF8Decode函数。 - David Heffernan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接