我读了Joel's article about character sets所以我正在接受他的建议,在我的网页和我的数据库中使用UTF-8。我无法理解的是如何处理用户输入。正如Joel所说,“如果不知道它使用的是什么编码,就没有意义。”但是,我如何知道用户输入字符串使用的编码?如果我有
<input type="text" name="atextfield" >
在我的页面上,我如何知道我从用户那里得到的编码?如果用户输入一些特殊的ASCII符号,如♣或™或其他什么,该怎么办?有什么方法可以检测到用户输入给了我一些在UTF-8中无法识别的东西?对于如何处理这类事情有一些标准吗?
答案 0 :(得分:1)
检查HTTP headers以发现字符编码。
答案 1 :(得分:1)
如果您的网页使用UTF-8,浏览器将为您转换为UTF-8。因此,即使特殊字符是ASCII格式,它也会以UTF-8格式提交。
但是,您永远不会知道将页面编码切换回ISO-8859的用户发痒 - *。
您可以在mb_detect_encoding上使用,但不是100%防弹。
/* Detect character encoding with current detect_order */
echo mb_detect_encoding($str);
/* "auto" is expanded to "ASCII,JIS,UTF-8,EUC-JP,SJIS" */
echo mb_detect_encoding($str, "auto");
/* Specify encoding_list character encoding by comma separated list */
echo mb_detect_encoding($str, "JIS, eucjp-win, sjis-win");
/* Use array to specify encoding_list */
$ary[] = "ASCII";
$ary[] = "JIS";
$ary[] = "EUC-JP";
echo mb_detect_encoding($str, $ary);
答案 2 :(得分:1)
请勿尝试检测,将所有用户输入的文本转换为应用程序中的UTF-8。通过配置您的网络服务器以发送UTF-8页面和UTF-8标头,配置您的应用程序以处理UTF-8中的所有文本,调整您的文件系统(如果需要)来处理文本文件,您可以尽力而为。 UTF-8,配置您的数据库,但您对用户端没有真正的控制权。您可以在html表单中建议正确的字符编码,如下所示,但它在用户端不是真正可执行的:
<form action="/index.php" method="post" accept-charset="UTF-8"></form>
除非检测到用户输入的编码是应用程序的全部目的,否则尝试是一个愚蠢的差事。假设编码错误并在您的应用中将其转换为UTF-8。正如您应该假设您的用户输入是恶意的并在您尝试将其插入数据库之前进行清理。
在大多数正确实施UTF-8的语言中,ASCII字符将在转换后继续存在,因此不必担心。