如何用 ASCII 表示重音符号?

How to represent acute accents in ASCII?

我在我的一个网站上遇到了与 cookie 相关的编码问题。

用户正在输入 Usuário,它带有重音,并且被放入 cookie 中。 cookie 响应的原始 HEX 是(对于 Usuário 字符串):

55 73 75 C3 A1 72 69 6F

当我在浏览器中看到它时,它看起来像这样:

...真是乱七八糟。我需要解决这个问题。

然后我去了这个网站:http://www.rapidtables.com/convert/number/hex-to-ascii.htm 并转换了 HEX 值,看看它会是什么样子。我得到了相同的输出:

没错。这意味着十六进制代码是错误的。然后我尝试将 Usuário 转换为 ASCII 以查看它应该如何。我使用了这个网站:http://www.asciitohex.com/ 结果是这样的:

令我惊讶的是,HEX 正是显示混乱的 。为什么???

我如何用 ASCII 表示 Usuário 以便将其放入 cookie 中?我应该手动编码吗?

PS:我正在使用 ASP.NET,以防万一。

截至 2015 年,网络存储字符数据的标准是 UTF-8 而不是 ASCII。 ASCII 实际上只包含代码页的前 128 个字符,不包括任何一种重音字符。要向这 128 个字符添加重音字符,有许多遗留解决方案:代码页。他们每个人都在默认的 ASCII 列表中添加了 128 个不同的字符,从而允许表示 256 个不同的字符。

问题是,这并没有正确解决问题:基于 ASCII 的代码页或多或少彼此不兼容(前 128 个字符除外),并且通常无法以编程方式知道哪个代码页已被使用。

其中一个解决方案是 UTF-8,这是一种对 unocde 字符集(包含世界上使用的大部分字符等)进行编码的方法,同时试图与 ASCII 保持兼容。前 128 个字符在这两种情况下实际上是相同的,但后来 UTF-8 字符变成了多字节:一个字符使用一系列字节编码(通常是 2-3,取决于需要编码的字符)

问题是如果您使用某种基于 ASCII 的单字节代码库(如 ISO-8859-1),它以单字节对支持的字符进行编码,但您的输入实际上是 UTF-8,它将编码重音符号多个字节中的字符(您可以在 HEX 示例中看到这一点。á 被编码为 C3 A1:两个字节)。如果您尝试在基于 ASCII 的代码页中读取这两个字节,每个字符使用单个字节(在西欧,此代码页通常是 ISO-8859-1),那么这两个字节中的每一个都将用两个不同的字符表示.

在网络世界中,默认编码是 UTF-8,因此您的客户通常会使用 UTF-8 发送他们的请求。 ASP.NET 支持 Unicode,因此它可以处理这些请求。然而,在您的代码中,这个 UTF-8 被意外地转换为 ISO-8859-1,然后又转换回 UTF-8。这可能发生在不同的层上。由于您有问题,它可能发生在 cookie 层,这有时会出现问题 (here is how it worked in 2009)。如果您想正确支持重音字符,您还应该仔细检查您的应用程序,它在其他任何地方(视图、数据库等)都使用 UTF-8。