有人能告诉我这个ASCII字符是什么吗?

4
我发现有一个时不时出现的字符,但在 ASCII 表中找不到。在将数据发送到数据库之前,我想要运行一个过滤器,但首先必须确定该字符是什么。也许有人知道这是什么。我使用所见即所得编辑器,这就是字符来自的地方。当我输入两个 \r 或一个退格键时,该字符似乎非常零散但经常出现。
以下是该字符:
Â

好的,建议我在文档头中将内容类型更改为utf8,但是我仍然在数据库中得到这些字符。这是我添加了内容类型后的测试。

adf af  aafd a a

aa a  afa a 

adf

看起来像是ASCII 194。您可以使用CHAR(194)在SQL Server中进行SQL REPLACE以清除它们。 - David Andres
...顺便说一下,要弄清楚这个问题,你可以将这段文本复制并粘贴到十六进制编辑器中,并注意其十六进制值。在Windows中,我可以使用字符映射程序来再次确认十六进制值,而在这个例子中是C2,是否与所显示的字符相匹配。 - David Andres
4
ASCII 194这个东西不存在。ASCII码只有7位。 - balpha
1
它在ISO 8859-1(Latin-1)和Windows-1252下是194。 - Adam Rosenfield
谢谢你们的提醒。那么我可以在Windows中使用charmap吗? - jim
5个回答

16

很可能这个字符与UTF-8编码问题有关。在此情况下,Joel的文章《关于Unicode和字符集的绝对最低限度,每位软件开发人员都必须知道(不容置辩!)》是绝对推荐阅读的。

在将字符发送到数据库之前过滤掉它们几乎肯定是错误的做法。

在你提到的情况下,你可能正在处理字符U+00A0,它是非间断空格的Unicode字符。这个字符的位模式是:

1010 0000
在进行UTF-8编码之后,编码字节看起来像:
110x xxxx  10xx xxxx

'x'代表 Unicode 字符值的一位,因此 U+00A0 的编码形式为:

1100 0010  1010 0000

第二个字符的字节值与您正在编码的原始字符(U+00A0)相同,即0xC2 0xA0。巧合的是,第一个字符是您看到的Â。


你永远不知道。我从一些stackoverflow答案中复制了一些代码,只发现它们充满了这个字符。 - David Andres
谢谢Greg。我现在要去这个链接。 - jim
Greg,这些字符散布在我的数据库中。如果可能的话,我需要清理它们,然后修复这个问题。 - jim
嘿,Greg,你还在这里吗?我正在查看那个文档,我说的对吗?我只需要在页面头部使用UTF内容类型就可以了吗? - jim
那对我没用,Greg。我仍然在数据库中得到它们。请看一下我在我的OP中的内容。 - jim
这就解释了为什么在使用非断空格查询/使用cURL访问内容时会看到那些 #$%&^ 的圆顶字母A。现在很清晰了!谢谢。 - chiliNUT

2

嗨,TomatoSandwich,谢谢你。这很有帮助。不过看起来我可能有一个编码问题。 - jim

1
当我遇到这个问题时,根据@Greg的回答,对我有用的解决方法是:

0xC2=194, 0xA0=160,

在php中:
$output=str_replace(chr(194).chr(160), " ", $html);

这将把Â替换为它们本应该是的 


0

我是楼主。我已经退出登录,但我回来分享解决方案。实际上问题出在编码上。我添加了:

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">

在我这样做之后,我注意到我的数据库仍然出现了一些奇怪的字符。然后我改变了数据库表上的编码,但也没有任何作用。只剩下浏览器了... 我检查了浏览器中的编码,发现它正在使用 ISO-8859-1。我将浏览器的编码更改为 utf-8,现在它可以正常工作了。:)

感谢所有做出贡献的人。


这是因为浏览器忽略了<meta>标签。你需要使用header发送正确的HTTP头。 - troelskn

0

我认为你遇到了我曾经遇到的一个 Bug。ISO-8859-1 实际上是针对西欧语言的 Windows-1152(我想是 1152)的一个子集。问题在于当 Web 服务器接受 ISO-8859-1 时,浏览器很乐意提交 Windows-1152 字符。这意味着浏览器发送的数据是无效的 ISO-8859-1。至少我的 Windows 安装就发生了这种情况。我在 IE 和 Firefox 中都见过这种行为。

我使用所见即所得编辑器遇到了这个问题,用户要从 Word 文档中粘贴数据。该文档将包含连字号和破折号。一个字符会被正确提交,而另一个字符则无法识别,因为该字符不在 ISO-8859-1 中(我永远记不清哪个是哪个)。

我们使用的 .net 框架也没有帮助,因为它在转换为 Unicode 时没有报告无效的 ISO 字符。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接