我正在编写一些代码来擦除我的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);
然而,当我将ASP TextBox设置为等于以下
时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
答案 0 :(得分: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左双引号。
如果要将Windows代码页(通常误称为'ANSI')转换为Unicode字符,则需要指定所需的代码页,例如:
System.Text.Encoding.getEncoding(1252).GetChars(new byte[] { 147 })
System.Text.Encoding.Default
将为您提供服务器上的默认编码。对于西欧语言环境中的服务器,这将是1252.在其他地方,它不会。在服务器应用程序中依赖于语言环境的默认代码页通常不是一个好主意。
在任何情况下,您都应该不在Web应用程序的输入中获取147表示“
的字节。只有当您的页面本身处于代码页1252编码时才会发生这种情况(并且只是为了混淆和误导更多,当您说您的页面采用ISO-8859-1格式时,浏览器将默默使用代码页1252)。如果你没有为它指定任何编码,你的页面也可能在1252(浏览器猜测;其他语言环境会猜测不同的代码页,所以它们都会是一团糟)。
确保您对网络应用中的所有编码使用UTF-8和mark your pages as such。今天,所有网络应用都应该使用UTF-8。
答案 1 :(得分:3)
.NET使用unicode(UCS-2),它与ASCII相同,仅适用于128以下的值。
ASCII不定义高于127的值。
我认为您可能会考虑使用ANSI,它将大多数欧洲语言所需的大多数语言字符定义为大于127的值。或定义字符>的OEM(原始IBM pc字符集)。 127(大多数)符号。
解释127以上字符的差异称为代码页或编码。 (因此System.Text.Encoding)。因此,如果使用不同的编码,可能System.Text.Encoding.Default
可能会使测试3工作。
编辑:好的,既然我们知道您想要的编码是ANSI,那么发生的事情就更清楚了。
字符转换的规则是将无法在编码中表示的字符替换为其他字符 - 通常是一个框。但是对于ASCII,没有盒子字符,所以它使用了?代替。这解释了测试3。
test1和2都使用带有整数常量的Convert.ToChar。这将把输入解释为UNICODE字符,而不是ANSI字符,因此不会应用任何转换。 Unicode字符147是非打印字符。
答案 2 :(得分:0)
我在控制台应用程序(.NET 3.5SP1)中获得了所有3个问号。据我所知,它们应该都是等价的。关于ASCII与ANSI,John Knoeller是正确的。
您是否尝试在原始字符串上使用其中一个编码类'GetBytes()并迭代,删除(通过将“好”字节复制到另一个缓冲区)您不想要的值?
e.g。 (使用Linq):
byte[] original = System.Text.Encoding.ASCII.GetBytes(badString);
byte[] clean = (from b in original where b < 145 || b > 148 select b).ToArray<byte>();
string cleanString = System.Text.Encoding.ASCII.GetString(clean);
说实话,ASCII可能是错误的;如果原始文本是Unicode,则可以想象会做坏事(例如,如果你通过了UTF-16)。