我的问题是我认为应该输出相同文本的以下三个字符串.
string test1 = Convert.tochar(147).ToString(); string test2 = String.Format("'{0}'",Convert.tochar(147)); char[] characters = System.Text.Encoding.ASCII.GetChars(new byte[] { 147 }); string test3 = new string(characters);
txtShowValues.Text = test1 + "*" + test2 + "*" + test3;
我得到test1的空白值,test2正常工作,test3输出为’?’.
有人可以用不同的方式解释发生的事情.我希望这将有助于我理解.NET如何使用超过128的字符的ASCII值,以便我可以编写一个很好的清理脚本.
编辑
我提到的值(145-148)是卷曲引号.单左,右单,双左,双右.
通过“正常工作”我的意思是它输出一个卷曲的报价给我的浏览器.
第二次编辑
以下代码(在答案中提到)也输出了引号.所以问题可能是在测试3中使用ASCII.
char[] characters2 = System.Text.Encoding.Default.GetChars(new byte[] { 147 }); string test4 = new string(characters2);
第三次编辑
我发现了一个可以借用的mac,并能够复制问题.当我将包含引号符号的文本从Word复制并粘贴到我在Mac上的Web应用程序中时,它会粘贴引号(147和148).当我点击保存时,卷曲引号被保存到数据库中,因此我将使用您帮助我的代码来擦除该内容.
FOUTH EDIT
花了一些时间根据这里的响应编写更多示例代码,并注意到它与ASP.NET中的MultiLine TextBoxes有关.这里有很好的信息,所以我决定刚开始一个新问题:ASP.NET Multiline textbox allowing input above UTF-8
解决方法
你想到的不是’ASCII’甚至’ISO-8859-1′,而是Windows代码页1252.这是一个非标准的编码,就像8859-1,但是将字符128-159分配给各种印刷扩展,如智能报价,而不是很大程度上无用的控制代码.在代码页1252中,字符147是“,即U 201C LEFT DOUBLE QUOTATION MARK.
如果要将Windows代码页(通常误导性地称为“ANSI”)转换为Unicode字符,则需要指定所需的代码页,例如:
System.Text.Encoding.getEncoding(1252).GetChars(new byte[] { 147 })
System.Text.Encoding.Default将为您提供服务器上的默认编码.对于西欧语言环境中的服务器,这将是1252.在其他地方,它不会.在服务器应用程序中依赖于语言环境的默认代码页通常不是一个好主意.
在任何情况下,您都不应该获得像147这样的字节,表示“在Web应用程序的输入中”.只有当您的页面本身处于代码页1252编码时才会发生这种情况(并且只是为了混淆和误导更多,当您说您的页面采用ISO-8859-1格式时,浏览器将默默使用代码页1252).如果你没有为它指定任何编码,你的页面也可能在1252(浏览器猜测;其他语言环境会猜测不同的代码页,所以它们都是一团糟).
确保您对Web应用程序中的所有编码使用UTF-8和mark your pages as such.今天,所有Web应用程序都应使用UTF-8.