-1

我正在尝试从 csv 读取数据并将其放入下拉列表中。此 CSV 以印地语字体 (shusha.ttf) 编写。

在阅读每一行时,我得到了垃圾值。

string sFileName = "C://MyFile.csv";   
Assembly assem = Assembly.GetCallingAssembly();   
FileStream[] fss = assem.GetFiles();   
if (!File.Exists(sFileName))   
{   
    MessageBox.Show("Items File Not Present");   
    return false;   
}   
StreamReader sr = new StreamReader(sFileName);  
string sItem = null;
bool isFirstLine = true;
do
{
     sItem = sr.ReadLine();
     if (sItem != null)
     {
          string[] arrItems = sItem.Split(',');
          if (!isFirstLine)
          {
               listItems.Add(arrItems[0]);
          }
          isFirstLine = false;
     }

} while (sItem != null);
      return true;
4

1 回答 1

1

您没有向 StreamReader 提供编码参数,因此它假设默认编码,这不是写入文件的编码。

并非所有文本文件或 csv 文件都相同。编码系统选择如何将“字符”(字形、文字图片、字母等)转换为字节以存储在计算机中。

有许多不同的编码系统 - ASCII、EBDIC、Utf8、Utf16、Utf32 等。

您需要确定文件是使用哪种编码编写的,并将其作为 Encoding 参数传递给 StreamReader 类。

我会认为该文件是用 UTF8 编写的,因为它是非英文文本的一个非常通用的标准;StreamReader的默认是在你不提供值的时候使用UTF8,所以很可能不是utf8。它可能是 UTF16,或者甚至可能是其他一些完全不同的编码。

对于那些想要了解 Unicode 背景的好奇者 - unicode 是一种标准,它为字形分配简单的数字,从 ascii 到雪人到普通话等等。Unicode 只是给每个字形一个数字,称为代码点。然而,Unicode 不是一种编码——它没有说明如何将这些代码点实际表示为字节。

UTF8 是一种 unicode 编码,可以覆盖整个 unicode 空间,UTF16 和 UTF32 也是如此。UTF8 为低于某个值的代码点写入 1 个字节,为低于某个较高值的代码点写入 2 个字节,依此类推,并使用每个字节中的信号位来帮助指示代码点是否使用一、二、三写入等字节。

例如,在内部,C# 使用 UTF16 表示字符串,这就是为什么如果您查看仅包含 ascii 文本的字符串的原始内存,您会看到很多 '0' 值 - ascii 不需要其他 8 位,所以这些值最终全为 0。

这是来自维基百科的链接,它解释了 UTF8 如何将代码点值中的位与信号位一起打包成字节以存储在内存中:https ://en.wikipedia.org/wiki/UTF-8

于 2013-06-26T13:52:24.950 回答