【发布时间】:2009-06-19 08:54:10
【问题描述】:
这里有 C# 问题..
我有一个 UTF-8 字符串,它正在由 C++ 中的非 Unicode 程序解释。此文本显示不正确,但据我所知,它是完整的,然后用作输出文件名。 .
无论如何,在 C# 项目中,我正在尝试使用 System.Windows.Forms.OpenFileDialog 对象打开此文件。我从这个对象的 .FileNames[] 获得的文件名是 Unicode (UCS-2)。但是,这个字符串被误解了。例如,如果原始字符串是 0xe3 0x81 0x82,则 FileName[].ToCharArray() 显示它现在是 0x00e3 0x0081 0x201a .... .. 看起来 OpenFileDialog 对象只是填充了它,但事实并非如此。在 OpenFileDialog 生成的第三个字符中,它是不同的,我无法弄清楚这个字节发生了什么..
我的问题是:有没有办法将 OpenFileDialog 框中突出显示的文件名视为 UTF-8?
我认为这无关紧要,但如果您需要知道,字符串是日文的..
谢谢,
克雷布
更新
首先,感谢所有在这里提出建议的人,非常感谢他们。
现在,要回答修改 C++ 应用程序以正确处理字符串的建议,这似乎不可行。对字符串执行此操作的不仅仅是一个应用程序。实际上,我的公司中有很多这样的应用程序需要我处理,这需要大量的人力和时间,而这根本不是可用的。但是,如果我要走这条路,sean e 的想法可能是最好的选择..
@Remy Lebeau:我想一针见血,我会尝试您提出的解决方案并报告回来.. :) 我想您的解决方案需要注意的是 Default 编码具有在 C# 应用程序环境中与创建文件的 C++ 应用程序环境相同,这当然是有道理的,因为它必须使用相同的代码页..
@Jeff Johnson:我没有将文件名从 C++ 应用程序粘贴到 C# 应用程序。我正在调用 OpenFileDialog.ShowDialog() 并在 DialogResult.OK 上获取 OpenFileDialog.FileNames 。我确实尝试使用编码.UTF8.GetBytes(),但就像 Remy Lebeau 指出的那样,它不起作用,因为原始的 UTF8 字节丢失了..
@everyone else: 谢谢你的想法.. :)
克雷布
更新
@Remy Lebeau:你的想法很完美!只要 C++ 应用程序的环境与 C# 应用程序的环境相同(非 Unicode 程序的语言环境相同),我就能检索到正确的文本.. :)
现在我有更多的问题..哈哈..有没有办法确定字符串的编码?该代码现在适用于被错误解释为 ANSI 字符串的 UTF8 字符串,但会破坏 UCS-2 字符串。我需要能够确定编码并相应地处理每个。 GetEncoding() 似乎没有用.. =/ StreamReader 的 CurrentEncoding 属性也不是(总是说 UTF-8)..
附:我应该在新帖子中打开这个新问题吗?
【问题讨论】: