【发布时间】:2016-03-06 13:49:42
【问题描述】:
我有一个 UTF-8 编码的输入文件。我需要使用它的一些内容并从中创建一个 ISO-8859-15 编码的 CSV 文件。
问题在于 UTF-8 似乎有几个用于双引号的字符,在将 CSV 文件写入光盘时,这些字符会自动替换为字符 " (= Quotation Mark U+0022)。
我们找到的是:
- Left Double Quotation Mark U+201C
- Right Double Quotation Mark U+201D
- Double Low-9 Quotation Mark U+201E
- Modifier Letter Double Prime U+02BA
- Combining Double Vertical Line Above U+030E
- Fullwidth Quotation Mark U+FF02
当我像这样写入 CSV 文件时,转换会自动发生:
using (StreamWriter sw = new StreamWriter(workDir + "/files/vehicles.csv", append: false, encoding: Encoding.GetEncoding("ISO-8859-15")))
{
foreach (ad vehicle in vehicles)
{
sw.WriteLine(convertVehicleToCsv(vehicle));
}
}
方法convertVehicleToCsv转义数据的双引号和其他特殊字符,但不转义特殊的UTF-8双引号字符。现在双引号被自动替换,CSV 不再符合 RFC-4180 并因此损坏。使用我们的 CSV 库读取它失败。
所以问题是:
在转换为 ISO-8859-15 时,还有哪些其他 UTF-8 字符会自动替换/转换为“正常”" 字符?这是在某处记录的吗?还是我在这里做错了什么?
【问题讨论】:
-
出于兴趣,您期望在这种情况下会发生什么?我假设 ISO-8859-15 不包含这些字符。
-
嗯,我喜欢它们被这样替换。但我需要知道哪些字符是这样“自动”处理的。
-
听起来您应该尽早将原始内容转换为 ISO-8859-15,以便转换发生在 转义之前。这会解决它而不必详尽地替换替换吗?您可以通过将字符串中的每个 Unicode 字符转换为一个字符串来天真地找到大量替换......但我不知道在某些情况下编码器是否会非常聪明地处理多个字符......
标签: c# .net csv utf-8 iso-8859-15