1

你们都做了如此出色的工作,回答了我之前认为的一个问题——我会在我深入转换之前问这个问题,结果却发现我做错了什么。我为自己制作的网站只有 3 页。它有表格,sqli db。有人告诉我使用 UTF-8(我部分使用了,但没有完全使用)哈哈。好的,听起来很酷。现在我想将其修复为 100% UTF-8 感知,我已经在 PHP、JS 和 HTML 中编写了大约 1,900 行代码,而不使用多字节函数。所以......这是我的问题......在我的转换中我已经做到了......(来自不同地方的代码片段......)

PHP

date_default_timezone_set('America/Toronto'); // sets the timezone to Eastern Stand Time

HTML

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>

ETC

SQL

(来自 cpanel 界面)MySQL 连接整理”:utf8_general_ci

SQL DB(仍处于 pre utf-8 模式)

用户名 varchar(50) latin1_general_cs

公司名称 varchar(50) latin1_swedish_ci

fname varchar(25) latin1_swedish_ci

我在表格中没有有价值的数据。我会将它们更改为以下之一(但我不确定是哪一个)...

utf8_general_ci 或 utf8_unicode_ci

虽然我想让该网站可供外国人使用,但这不是一个高优先级,但因为我正在使用 UTF-8 风格,它可能已经适用于外语。

我的问题是...

1)我设置了我的时区,我没有在php中设置我的语言环境,因为我从来没有这样做过。我需要这样做吗?我如何为我的多伦多/加拿大位置做到这一点?

2)通过元标记设置每个页面是否足以使整个页面变成UTF-8

3)使用元标记是否意味着我的所有表单字段都已作为 UTF-8 数据输入?如果没有,我该如何改变它们。

4)我的数据库使用哪一个?utf8_general_ci 或 utf8_unicode_ci

5)我需要某些东西区分大小写。我只看到 ci 为 utf8。这是因为“戴夫”与“戴夫”不同,所以使用多字节比较自动比较大小写...??!?!?!

6)我的数据库目前有 50 个字符用于 ASCII 内容的存储 - 我假设通过在数据库中切换到 utf-8 ,对于像我这样的英国人来说,50 个存储就可以了 - 但是如果一些外国人出现并输入了一堆奇怪的符号我需要将存储空间增加 x4 以容纳 unicode 的所有额外字节?我不介意用掉更多的存储空间,但我很好奇分配它的正确方法是什么。既然它是一个 VARCHAR(50) ,它真的很重要吗?如果名称是“Dave”,它将是 4 个字符。如果是外国名字,符号中的“Dave”可能是12个字符!哈哈。因此,如果我将 100 分配给应该做的用户名字段,因为不太可能所有字符都是 4 个字节。或者,只需将其设置为 x4,就像我对英语的要求一样,并将它们全部设为 VARCHARS 以节省空间。当他们在表单上输入数据时,我将使用 MB_LENGTH 函数(我忘记了确切的函数),所以我仍然能够控制输入多少字符。

7)如何测试我的 unicode 网站?除了漂亮的英语,我从未使用过其他任何东西:) 大声笑。如何切换浏览器?假装我来自其他地方并输入一堆代码,看看我的函数在我重写它们以使用 mb_(多字节)函数后是否工作。或者,没有什么可以切换的......我只需输入 ALT 245 或其他东西,我就会得到符号?!?!?我不知道如何输入外国测试字符!因为我没有对我的网站进行足够的测试,所以让所有外国客户都无法输入密码,这将是很糟糕的 :)

8)我知道使用某些函数 ctype、mb_ 来处理 unicode 比较、字符串等。对我来说有什么惊喜吗?不能正常工作的事情?

是的……我很啰嗦!:) 我使用 Dreamweaver CS3,但这没关系。我的实际文件中没有嵌入 UTF-8 字符。

等待你的智慧...

4

2 回答 2

1

我将从一些答案开始:

2)您的服务器还应该发送标头,表明发送的内容是 UTF-8:

header('Content-Type: text/html; charset=UTF-8');

3) 浏览器将以 UTF-8 格式发送数据,是的。但黑客可能不会,所以你也应该在你的htmlententies和类似的 HTML 编码函数中给出 UTF-8-Charset(参见example exploit

5)不区分大小写的排序规则仅意味着在执行 WHERE 子句时,大小写不起作用。

6) 实际上恰恰相反:在 ASCII 中你可能需要比 UTF-8 更大的 VARCHAR(“Dave”是 4 个字符,4 个字节;“ǝʌɐp”是 4 个字符,8 个字节。)

于 2011-07-31T18:18:53.783 回答
0

1)关于Set locale information,它可以影响一些字符串函数(即strtoupper()),其目的是影响和改变一些“事物”的运行方式。例如,在正则表达式中,它会改变\w \W预期的(Word 字符)的方式。但是随着越来越多的应用程序改用 Unicode,对这种语言环境支持的需求预计会消失。

7) W3C可以帮助你一点。

关于测试角色并假装你是来自中国或其他地方的另一个人:

索引.php:

<head>
<meta charset="UTF-8"><!-- This tag encode the text that will be typed within a text area (If the accep-charset="" is not speciefied)
If the character typed isnt part of the encoding the character will be escaped**-->
</head>

<form method="POST" action="encode.php" accept-charset="UTF-8"><!--accept-charset"" is used to set the encoding that will be used to transmit the characters over a form-->
<p><textarea name="input" maxlength="256" rows="5" cols="100"></textarea></p>
<p><button>Submit</button></p>
</form>

**转义字符

然后在encode.php中你可以控制你的输入:

$input=$_POST["input"];
于 2011-07-31T19:46:55.407 回答