Jus*_*n C 6 .net asp.net ascii character-encoding
我正在编写一些代码来擦除我的ASP.NET站点的用户输入.我需要擦除输入以删除对ASCII字符145,146,147,148的所有引用,这些引用偶尔会从我的mac用户那里获得输入,这些用户正在复制和粘贴他们在Mac上的文字处理器中写入的内容.
我的问题是我认为应该输出相同文本的以下三个字符串.
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);
Run Code Online (Sandbox Code Playgroud)
然而,当我将ASP TextBox设置为等于以下内容时
txtShowValues.Text = test1 + "*" + test2 + "*" + test3;
Run Code Online (Sandbox Code Playgroud)
我得到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);
Run Code Online (Sandbox Code Playgroud)
第三次编辑
我发现了一个我可以借用的mac并能够复制问题.当我将包含引号符号的文本从Word复制并粘贴到我在Mac上的Web应用程序中时,它会粘贴引号(147和148).当我点击保存时,卷曲引号被保存到数据库中,因此我将使用您帮助我的代码来擦除该内容.
FOUTH EDIT
花了一些时间根据这里的响应编写更多示例代码,并注意到它与ASP.NET中的MultiLine TextBoxes有关.这里有很好的信息,所以我决定刚开始一个新问题:ASP.NET Multiline文本框允许输入UTF-8以上
bob*_*nce 11
字符147是U + 0093 SET TRANSMIT STATE.与0-255范围内的所有Unicode字符一样,它与相同数字的ISO-8859-1字符相同.ISO-8859-1为这个不可见的控制代码分配了147.
你想到的不是'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 })
Run Code Online (Sandbox Code Playgroud)
System.Text.Encoding.Default将为您提供服务器上的默认编码.对于西欧语言环境中的服务器,这将是1252.在其他地方,它不会.在服务器应用程序中依赖于语言环境的默认代码页通常不是一个好主意.
在任何情况下,您都不应该获得像147这样的字节“来表示Web应用程序的输入.只有当您的页面本身处于代码页1252编码时才会发生这种情况(并且只是为了混淆和误导更多,当您说您的页面采用ISO-8859-1格式时,浏览器将默默使用代码页1252).如果你没有为它指定任何编码,你的页面也可能在1252(浏览器猜测;其他语言环境会猜测不同的代码页,所以它们都是一团糟).
确保对Web应用程序中的所有编码使用UTF-8,并将页面标记为此类.今天,所有网络应用都应该使用UTF-8.