将UTF8转换为ASCII

15
我有一个从存储在UTF8编码的XML文件中读取的文本。C#可以完美地读取它,我通过调试器进行了检查,但是当我尝试将其转换为ASCII以保存在另一个文件中时,会在存在冲突字符的位置得到一个? 字符。例如,这个文本:

I have a text read from a XML file stored in UTF8 encoding. C# reads it perfectly, I checked with the debugger, but when I try to convert it to ASCII to save it in another file I get a ? char in places where there was a conflicting character. For instance, this text:

string s = "La introducción masiva de las nuevas tecnologías de la información";

将被保存为

"La introducci?n masiva de las nuevas tecnolog?as de la informaci?n"

我不能仅仅用它们的拉丁语元音字母(a, e, i, o, u)来替换它们,因为西班牙语中的一些单词将失去意义。我已经尝试过这个这个问题,但都没有成功。所以我希望有人能帮助我。第二个问题中选择的答案甚至没有编译通过...!

如果有人想看一下我的代码,就是这样:

private void WriteInput( string input )
{
   byte[] byteArray = Encoding.UTF8.GetBytes(input);
   byte[] asciiArray = Encoding.Convert(Encoding.UTF8, Encoding.ASCII, byteArray);
   string finalString = Encoding.ASCII.GetString(asciiArray);

   string inputFile = _idFile + ".in";
   var batchWriter = new StreamWriter(inputFile, false, Encoding.ASCII);
   batchWriter.Write(finalString);
   batchWriter.Close();
}
2个回答

38

那些字符在ASCII码表中没有对应的映射。请查看ASCII表格,如维基百科上的表格进行验证。你可能会对Windows 1252编码感兴趣,也称为"扩展ASCII",它有许多带重音符号的字符编码。

var input = "La introducción masiva de las nuevas tecnologías de la información";
var utf8bytes = Encoding.UTF8.GetBytes(input);
var win1252Bytes = Encoding.Convert(
                Encoding.UTF8, Encoding.GetEncoding("windows-1252"), utf8bytes);
File.WriteAllBytes(@"foo.txt", win1252Bytes);

@David:对我来说完美运行,使用上面的测试用例。确保你的代码中没有卡着 ASCII 编码(Encoding.ASCII)。 - Michael Petrotta
抱歉!我再次测试了一下,现在完美运行了...现在我知道你为什么有18.3K的声望了!!! ;) - David Conde
如果可以的话,我会加很多个+1! :) - dba

9

无法完成。ASCII码表中没有这些字母,所以最好的方法是对它们进行URL编码或Unicode转义编码。


为什么?如果 ASCII 没有这些字母,如何在 Notepad++ 中将编码从 UTF8 更改为 ASCII 并正常工作? - David Conde
5
因为Notepad++并不真正使用ASCII编码,它使用的是类似于CP1250的编码,该编码确实具有那些字母。 - Ignacio Vazquez-Abrams
2
Notepad++将转换为Win-1252代码页(拉丁文),其中重音位于表的较高一半(字符代码128+)。但是,这不是ASCII,而是ASCII的扩展。 ASCII仅定义0-127范围内的字符。同时,在设置了不同代码页的机器上打开该文件,将显示不同的字符来代替带重音符号的字符。例如,在Win-1251中,您会看到一些西里尔字母。 - Franci Penov

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