C#问题在这里..
我有一个UTF-8字符串,由C ++中的非Unicode程序解释。这个文本显示不正确,但据我所知,是完整的,然后应用作输出文件名。
无论如何,在C#项目中,我试图用 System.Windows.Forms.OpenFileDialog 对象打开这个文件。我从这个对象的 .FileNames [] 获得的文件名是Unicode(UCS-2)。但是,这个字符串被误解了。例如,如果原始字符串是 0xe3 0x81 0x82 ,则FileName []。ToCharArray()显示它现在是 0x00e3 0x0081 0x201a .... ..似乎OpenFileDialog对象只填充它,但它不是..在OpenFileDialog产生的第三个字符中,它是不同的,我无法弄清楚这个字节发生了什么.. < / p>
我的问题是:有没有办法将OpenFileDialog框中突出显示的文件名视为UTF-8?
我不认为这是相关的,但如果您需要知道,该字符串是日语..
谢谢,
的Kreb
更新
首先,感谢所有在这里提出建议的人,非常感谢他们。
现在,为了回答修改C ++应用程序以正确处理字符串的建议,它似乎不可行。这不仅仅是一个应用程序对字符串这样做。我公司实际上有很多这些应用程序,我必须使用它,并且需要大量的人力和时间,而不是可用。然而,如果我采取这条路线,肖恩的想法可能是最好的选择..
@Remy Lebeau:我认为你的目标就在头上,我会尝试你提出的解决方案并报告回来...... :)我想你的解决方案的警告是默认编码有在C#应用程序环境中与创建该文件的C ++应用程序环境相同,这当然有意义,因为它必须使用相同的代码页。@Jeff Johnson:我没有将C ++应用程序中的文件名粘贴到C#应用程序..我正在调用OpenFileDialog.ShowDialog()并在DialogResult.OK上获取OpenFileDialog.FileNames ..我确实尝试使用编码.UTF8.GetBytes(),但是像Remy Lebeau所指出的那样,它不会起作用,因为原来的UTF8字节丢失了。
@everyone else:感谢您的想法...... :)
的Kreb
更新
@Remy Lebeau:你的想法很完美!只要C ++应用程序的环境与C#app的环境相同(非Unicode程序的相同语言环境),我就能检索到正确的文本.. :)
现在我有更多问题..哈哈..有没有办法确定字符串的编码?该代码现在适用于被错误地解释为ANSI字符串的UTF8字符串,但是会破坏UCS-2字符串。我需要能够确定编码并相应地处理每个。 GetEncoding()似乎没用.. = /并且StreamReader的CurrentEncoding属性(总是说UTF-8)也没有。
P.S。我应该在新帖子中打开这个新问题吗?
答案 0 :(得分:2)
0x201a是Unicode“低单逗号引号”字符。 0x82是该字符的Latin-1(ISO-8859-1,Windows代码页1252)编码。这意味着文件名的字节被解释为普通的Ansi而不是UTF-8,因此相应地从Ansi解码为Unicode。这并不奇怪,因为文件系统没有UTF-8的概念,Windows假定非Unicode文件名使用操作系统的默认Ansi编码。
要执行您要查找的内容,您需要访问原始的UTF-8编码字节,以便正确解码它们。您可以尝试的一件事是将FileName传递给System.Text.Encoding.Default的GetBytes()方法(理论上,它使用的是用于解码文件名的相同编码,因此它应该能够生成与原始字节相同的字节),然后将结果字节传递给System.Text.Encoding.UTF8的GetString()方法。
答案 1 :(得分:1)
我认为你的问题刚刚开始:
我有一个UTF-8字符串 由非Unicode程序解释 在C ++ ..这个文本显示 不正确,但据我所知, 是完整的,然后作为一个应用 输出文件名..
如果您使用非unicode程序加载UTF-8字符串然后序列化它,它将包含非unicode字符。
你的C ++程序有没有办法处理Unicode? p>
答案 2 :(得分:1)
您是否可以使用System.Text命名空间的成员(例如,UTF8Encoding类)将.NET框架的内部字符串表示形式转换为包含所选编码文本的字节数组?
答案 3 :(得分:1)
如果您确定C ++输出正常,那么在C#应用程序中,您应该使用.NET encoding class将其从UTF-8转换为UTF-16,并且只需使用Windows本机格式。< / p>
如果您可以修改C ++应用程序,那可能会更好 - 提供不需要重新编码的C#app输入。在其中,UTF8到Unicode的转换可以通过MultiByteToWideChar处理,使用CP_UTF8作为CodePage参数,但只有在没有为dwFlags设置任何标志时才能处理(dwFlags指定为0)。整个应用程序不需要是Unicode。即使它不是编译的unicode,您也可以选择性地使用Unicode API。
答案 4 :(得分:1)
在回答你的问题时“有没有办法将文件名视为utf-8?”试试这段代码:
List<byte[]> utf8FileNames = new List<byte[]>();
foreach (string fileName in openFileDialog1.FileNames)
{
utf8FileNames.Add(Encoding.UTF8.GetBytes(fileName));
}
// Each byte array in utf8FileNames is a sequence of utf-8 bytes matching each file name chosen
从打开文件对话框中获取文件后,您如何处理文件名?你可以发布那段代码吗?