不同的PHP编码

  1. 作者
  2. x64(又名andi)

新手脚本编写者不关心编码这样的事情。 因此,在网站上,您有时会发现一个可怕的混乱,当数据库中的数据是在一个编码中获得时,页面是在另一个编码中形成的,而服务器则是第三个。 因此,如果页面可以解密,那么至少2次。 那么,为什么会出现这样的问题以及如何克服它?  在俄罗斯片段中,您最常可以找到所谓的Windows编码。 换句话说:windows-1251,cp1251甚至是ansi。 接下来是utf-8。 您也可以找到名称unicode,但这并不完全正确,因为Unicode是整个组的通用名称(utf-8,utf-16,utf-32)。 一个非常流行的罕见是koi8-r或简单的koi-8--曾经流行的Linux编码。 当然,有可能在俄罗斯片段中遇到别的东西,但这是作者的“放纵”。   utf-8和其他(主要是windows-1251和koi8-r)之间的主要区别是最后一个字节,使用这些编码可以表示的最大字符数限制为256

新手脚本编写者不关心编码这样的事情。 因此,在网站上,您有时会发现一个可怕的混乱,当数据库中的数据是在一个编码中获得时,页面是在另一个编码中形成的,而服务器则是第三个。 因此,如果页面可以解密,那么至少2次。 那么,为什么会出现这样的问题以及如何克服它?

在俄罗斯片段中,您最常可以找到所谓的Windows编码。 换句话说:windows-1251,cp1251甚至是ansi。 接下来是utf-8。 您也可以找到名称unicode,但这并不完全正确,因为Unicode是整个组的通用名称(utf-8,utf-16,utf-32)。 一个非常流行的罕见是koi8-r或简单的koi-8--曾经流行的Linux编码。 当然,有可能在俄罗斯片段中遇到别的东西,但这是作者的“放纵”。

utf-8和其他(主要是windows-1251和koi8-r)之间的主要区别是最后一个字节,使用这些编码可以表示的最大字符数限制为256.不言而喻,全文可能还不够。 并为html找到了一个解决方案 - 使用所谓的助记符。 例如:

© - ©

除了每个这样的字符由一组字符描述的事实之外,代码变得不可读并且与文本的工作变得更加复杂。 这就是多字节utf-8拯救的地方。 在一个文本中使用不同字母和不同符号的字母非常方便。

因此,最舒适的初始条件集如下:数据库,php脚本和html pages / js脚本的编码应该是相同的。 当然,您可以使用不同的,但在这种情况下,存在混淆的风险。 使用哪个代码页无关紧要。 如果该网站仅供俄语用户使用,那么windows-1251就足够了。 否则,utf-8将是合乎逻辑的选择。 第一种选择或多或少都很清楚。 多字节编码需要一些手势。

使用utf-8时,标准的记事本记事本将无法使用 ! 事实是,这个编辑器在以这种编码保存文件时,会在开头添加一个签名--3个字符,即所谓的bom(字节顺序标记),可用于确定打开文件时的编码。 最好选择另一个编辑器: 的Notepad2 记事本++ 。 在设置中,您必须选择保存而不签名。

下一个重要步骤是使用数据库。 非常希望base / table / text字段的编码与脚本编码匹配(它可以是cp1251或utf-8,或其他东西)。 如果来自数据库的数据是以“zyuk”的形式获得的,则很可能连接的编码与存储在数据库中的数据不同。 以下查询将有助于克服这种情况(在连接到数据库后立即执行):

如果该站点使用Windows-1251,您应该指定它 - cp1251。

一般来说,没有什么困难。 只是,标准的PHP函数不适用于多字节字符串。 但是有标准库可以帮助纠正这种情况: 的iconv MBSTRING 。 对于正则表达式,还有一个用修饰符u激活的必要开关。

嗯,获取数据库中的数据,脚本根据所有规则编写。 仍然需要发送正确的标题并在用户的浏览器中显示页面代码。 我们发送标题如下:

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

如果使用单字节编码,charset的值将不同 - windows-1251 。 在那之后,问题不应该存在。

在php中使用utf-8的一些最简单的例子:

示例1: iconv,每行的字符数

$ s ='string'; #tring in utf-8 $ cnt1 = strlen($ s); #将包含值$ 12 cnt2 = iconv_strlen($ s,'UTF-8'); #correct value,6

示例2: mbstring,字符串中的字符数

$ s ='string'; #tring in utf-8 $ cnt1 = strlen($ s); #将包含值$ 12 cnt2 = mb_strlen($ s,'UTF-8'); #correct value,6

例3:正则表达式,搜索和替换

$ s ='字符串'; #line in utf-8 $ s = preg_replace('/ p / i','d',$ s); #替换不会发生$ s = preg_replace('/ p / iu','d',$ s); #results word dock

i修饰符规定了不区分大小写的搜索, u修饰符告诉正则表达式引擎使用utf-8字符串。

如果有人说php无法使用utf-8,那就错了。 几年来,我一直在用这种编码完成所有项目,并且没有任何问题。 搜索引擎本身很久就使用了这种精彩的编码。

作者

离线11个小时

x64(又名andi)

评论:2846出版物:395注册:02-04-2009