【问题标题】:Encoding of character in textfield doesnt show correctly in export using ASP.NET MVC文本字段中的字符编码在使用 ASP.NET MVC 导出时无法正确显示
【发布时间】:2021-03-20 03:52:46
【问题描述】:
有人在输入高度时加上了这个撇号,可能是从 Word 文档中复制和粘贴的。它在网络上显示良好,但在导出时,文本会带有一个有趣的字符。我可以在输入保存或导出上做些什么来解决这个问题,而不会导致整个网站出现问题吗?我正在使用 ASP.NET MVC 和 .NET 4.8。
文本输入
6’2
CSV 导出
6’2
【问题讨论】:
标签:
.net
asp.net-mvc
csv
character-encoding
export-to-csv
【解决方案1】:
根据您保存文件的方式,最简单的方法可能是确保将其写为 Unicode。假设您可以选择StreamWriter,您可以这样做:
void Main()
{
var dt = new DataTable();
dt.Columns.Add("C1");
dt.Columns.Add("C2");
var r = dt.NewRow();
r[0] = "test";
r[1] = "6’2";
dt.Rows.Add(r);
var streamWriter = new StreamWriter("D:\\test.csv"); // defaults to Unicode
foreach(DataRow row in dt.Rows)
for (int i = 0; i < dt.Columns.Count; i++)
{
streamWriter.Write(row[i].ToString());
streamWriter.Write(",");
}
streamWriter.Flush();
}
【解决方案2】:
您的文本似乎写成 Unicode(特别是 UTF8)就好了。
请记住,CSV 文件只是字节,因此正确读取它需要写入者和读取者就编码达成一致。
如果你把一个UTF8编码的字符(U+2019)读者也必须理解相同的编码,并同意使用它。如果没有,您将获得“mojibake”。这并不意味着内容错误(或更改)。它只是以读者不期望的格式编码。
显然您使用的是西方字符集。如果您的计算机设置为俄语,那么您的输出会有所不同。
你能透露一下你用什么来读取创建的文件吗?也许您应该按照上面评论中的建议放置 BOM 标记?这告诉理解 UTF8 的读者,这个 是 实际上是一个 UTF8 文件。注意:不理解 BOM 标记的读者可能会将其显示为不可读的字符。
如果您必须为此文件使用旧版阅读器,一种解决方案可能是使用 iconv 或类似工具解析文件。
’
https://unicode-table.com/en/2019/
UTF8 encoded:
E2 80 99 hex
226 128 153 decimal
Read as Windows 1252
6’2
â = E2
€ = 80
™ = 99
【解决方案3】:
试试这个
string utf8_String = "day’s";
byte[] bytes = Encoding.Default.GetBytes(utf8_String);
utf8_String = Encoding.UTF8.GetString(bytes);