首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从UTF-8转换到ISO-8859-15时,哪些双引号字符会被自动替换?

从UTF-8转换到ISO-8859-15时,哪些双引号字符会被自动替换?
EN

Stack Overflow用户
提问于 2015-12-02 10:44:08
回答 2查看 2.7K关注 0票数 1

我有一个输入文件是UTF-8编码的。我需要使用它的一些内容,并从它创建一个ISO-8859-15编码CSV文件。

问题是,UTF-8似乎有几个双引号字符,在将CSV文件写入光盘时自动替换为字符" (= 引号U+0022)。

我们发现的是:

  • 左双引号U+201C
  • 右双引号标记U+201D
  • 双低-9报价标记U+201E
  • 修饰符双素数U+02BA
  • 结合U+030E上方的双线垂直线
  • 全宽度引号U+FF02

当我像这样写入CSV文件时,转换会自动发生:

代码语言:javascript
复制
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字符会自动替换/转换为“正常”"字符?这在什么地方有记录吗?还是我在这里做错了什么?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-12-02 15:05:58

为了回答您的问题,下面是.NET正在映射到U+0022的Unicode代码点列表(您称之为“普通双引号”符号)。

  • U+0022
  • U+02BA
  • U+030E
  • U+201C
  • U+201D
  • U+201E
  • U+FF02

使用这个答案,我快速地编写了一些东西,创建了UTF-8到ISO-8859-15 (拉丁文-9)的反向映射。

代码语言:javascript
复制
Encoding utf8 = Encoding.UTF8;
Encoding latin9 = Encoding.GetEncoding("ISO-8859-15");
Encoding iso = Encoding.GetEncoding(1252);

var map = new Dictionary<string, List<string>>();

// same code to get each line from the file as per the linked answer

while (true)
{
    string line = reader.ReadLine();
    if (line == null) break;
    string codePointHexAsString = line.Substring(0, line.IndexOf(";"));
    int codePoint = Convert.ToInt32(codePointHexAsString, 16);

    // skip Unicode surrogate area
    if (codePoint >= 0xD800 && codePoint <= 0xDFFF)
        continue;

    string utf16String = char.ConvertFromUtf32(codePoint);
    byte[] utf8Bytes = utf8.GetBytes(utf16String);
    byte[] latin9Bytes = Encoding.Convert(utf8, latin9, utf8Bytes);
    string latin9String = latin9.GetString(latin9Bytes);
    byte[] isoBytes = Encoding.Convert(utf8, iso, utf8Bytes);
    string isoString = iso.GetString(isoBytes); // this is not always the same as latin9String!

   string latin9HexAsString = latin9[0].ToString("X");

    if (!map.ContainsKey(latin9HexAsString))
    {
        isoMap[latin9HexAsString] = new List<string>();
    }
    isoMap[latin9HexAsString].Add(codePointHexAsString);
}

有趣的是,ISO-8859-15似乎比ISO-8859-1替换了更多的字符,这是我没想到的.

票数 2
EN

Stack Overflow用户

发布于 2015-12-02 21:29:31

.NET框架在从Unicode转换到遗留字符编码(如ISO-8859-15 )时默认使用最佳匹配映射。这在MSDN上的Windows协议Unicode参考中有记录。该文档引用了微软下载中心的一个名为“排序权重表”的下载,其中包含了Windows支持的遗留编码的最佳匹配映射(在撰写本文时的文件"Windows支持的代码页数据Files.zip“中)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34040740

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档