gpt4 book ai didi

mysql - 如何在保存之前清理用户输入以进行正确的内容编码?

转载 作者:IT老高 更新时间:2023-10-29 00:16:44 24 4
gpt4 key购买 nike

我有一个应用程序,用户可以在其中将文本输入到表单中。

数据保存到MySQL数据库(collat​​ion: utf8_general_ci),然后输出为XML(编码:UTF-8)。

问题是人们倾向于从其他来源剪切和粘贴他们的信息,例如 Microsoft Word 文档或 PDF。

此输入文本通常包含输出编码不正确的字符,例如“智能引号”,来自 Windows-1252 encoding 中的文档

这显然会在转换或以其他方式处理 XML 时引起问题,因为这些字符是非法的。

那么,如何净化输入呢?

以前,我使用过一些相当暴力的方法,比如 "de-moronize" script其中包含一长串搜索和替换操作。

这仍然是最好的方法吗?还有其他方法吗?

我可以只设置 accept-charset attribute 吗?在表格上并让浏览器为我做?

如果是这样,哪些浏览器会这样做,可能会出现任何问题吗?

另外,我的数据库怎么会接受这些字符,它们是 UTF-8 中的保留/控制字符?

如您所见,我对编码的了解足够多,知道我遇到了问题,但我现在有点不知所措...

TIA

最佳答案

This input text often has characters which are incorrect for the output encoding, things like "smart quotes", which come from a document in Windows-1252 encoding

“智能引号”(cp1252 中的字节 147 和 148)是完全有效的 Unicode 字符,U+201C 和 U+201D。您的应用程序应该能够无缝地处理它们;如果没有,你做错了什么,很可能所有非 ASCII 字符都会失败。

无论字符是来自输入它们的人还是来自 Word 粘贴的人,浏览器都应该向您的应用程序提交 UTF-8 编码的字符,该应用程序应该将相同的 UTF-8 字节存储到数据库中。

如果浏览器未以 UTF-8 格式提交,您可能无法设置包含表单的 HTML 页面的字符集。这可以使用:

Content-Type: text/html;charset=utf-8

HTTP header 和/或:

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

中的元素。

Can I just set the accept-charset attribute on the form and have the browser do it for me?

不,由于 IE,accept-charset 基本上没用,IE 将其误解为“如果页面上的字符集无法编码我们想要的字符,请尝试使用此字符集”,而不是“始终使用此字符集”。这意味着如果您使用 accept-charset ,您最终可能会同时提交多种编码,而无法确定哪个是哪个。不错!

how come my database is accepting these characters, which are reserved/control characters in UTF-8?

在 MySQL 中,UTF-8 只是一个排序规则,用于比较和排序。它仍然将数据存储为字节,并不关心它们是否不是有效的 UTF-8 序列。

无论如何,在您的应用程序中解码和检查传入的 UTF-8 序列是个好主意,因为在现代 Unicode 中无效的“短序列”可以隐藏旧浏览器仍可识别的“<”字符(至少IE6 pre-SP2,Opera 7)。

预计到达时间:

So, I entered a string containing byte 146

不,您输入了一个 Unicode 字符 U+201B。浏览器处理 Unicode 字符,而不是字节,直到它必须将序列化的表单提交给服务器。然后它决定如何将字符转换为字节,如果页面被处理为 UTF-8,它将始终选择 UTF-8。

(如果不是 UTF-8,浏览器往往会以不符合标准的方式作弊:对于所有不适合编码的字符,它会将它们编码为 HTML 字符引用,例如 '’ ;'。这是错误的,因为您现在无法区分浏览器转义的 '&' 和真实的、用户键入的 '&',而且这是非常错误的,因为如果您随后将引用回显为未转义的 HTML,它看起来就像您做对了一样,实际上您只是制造了一个很大的旧安全漏洞。)

It went into the database as 146

真的是一个‘\x92’字节,而不是‘\xC2\x92’、‘\xE2\x80\x99’或‘’’?

it came out when I produced the (UTF-8-encoded) XML, as 146. No complaints from the browser

然后它并没有以单个 146 字节的形式出现。当在 XML 文件中给出一个裸露的“\x92”时,浏览器会报错。 (不是 HTML 文件,其中无效的 UTF-8 序列作为缺失字符字形出现。)

我怀疑它是作为“’”字符引用出现的,它是格式正确的(尽管字符 U+0092 是 C1 控制集的一部分,因此不会呈现为任何有用的东西)。如果发生了这种情况,那么您的表单页面毕竟没有被选择为 UTF-8,并且您正在遭受上述浏览器自动转义提交问题。

关于mysql - 如何在保存之前清理用户输入以进行正确的内容编码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/750071/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com