Unicode PHP源文件

4

我目前正在进行的项目需要在一些php文件中添加一些unicode字符。

所以我需要使用unicode编码。

这让我想到了一个问题:

什么阻止我在所有的PHP文件中使用unicode?

4个回答

5

没有任何阻止您在所有php文件中使用Unicode,但如果这样做,则可能需要编辑脚本,因为设置的Unicode设置会干扰脚本处理。


所以基本上你的意思是:你可以使用它,但以后可能会让你吃亏? - PeeHaa
1
是的。通常需要更多的工作,而且我个人不知道有多少人设置了Unicode,但在某些情况下,它可能会证明很有用,例如,如果您拥有一个多语言银行网站。 - Basic
我正在开发一个分页器,并将我的页面作为UTF-8提供。所以我想,为什么不使用真正的»等字符呢? - PeeHaa
2
从PHP的角度来看,这完全没有问题。当您的键盘可以直接输入“raquo”等字符时,这尤其方便。☺唯一可能出现的问题是,当某些人使用不了解UTF-8的疯狂文本编辑器编辑文件时,您的页面上会出现问号... - bobince
@bobince: 我在Windows下使用EditPlus 进行开发,其对UTF-8编码没有问题。但是,生产服务器是Linux,我可能需要使用Vi编辑某些文件。 有没有使用Vi编辑UTF-8编码的文件(没有BOM)的经验? - PeeHaa

3
当您使用UTF8编码的源文件时,请记住以下几点:
  1. 某些编辑器可能会在文件开头添加BOM - 这可能会损坏脚本输出 - 您应该保存没有BOM的文件。
  2. strlen和其他字符串函数可能无法按您所期望的那样工作 - 您应该使用多字节字符串函数来获取字符串长度等信息:http://php.net/manual/en/book.mbstring.php
  3. 正则表达式需要u修饰符才能处理unicode字符。
  4. 在处理文件时,您应该注意当前的编码,因为当文件不包含BOM(参见#1)时,编辑器可能会以系统默认编码打开它。
  5. 一些源代码工具可能无法正确处理UTF8文件(因为它们不包含BOM,但其中一些即使在文件中有BOM时也会出现错误)。
根据我的经验,有时最好将字符串存储在资源(文本文件或其他文件)中,并且不要在代码文件中使用UTF8,但有时这是可以的 - 这取决于您是否遇到了问题。

谢谢信息。但我认为您指的是BOM(字节顺序标记)。BOF是另外一回事吗? - PeeHaa

1

我为什么不能在所有的PHP文件中都使用Unicode呢?

具体的编码方式可能会有影响。PHP本身并不专门处理文件输入,而是将其视为二进制序列。

唯一与PHP源文件级兼容的Unicode编码是UTF-8。

注意不要将php文件保存为UTF-8-BOM格式。因为它位于开头的<?php标记之前,PHP会将其视为标准文本并输出。

{UTF8-BOM}<?php

输出是不可见的,但字节长度为三,这可能导致已发送标头错误或在DOM中插入文本节点,而这些节点并不被期望。

非常感谢您一百万。我的问题确实是我没有使用UTF-8,而是在Ultraedit中使用了“通用”的UNICODE,这让我疯了。 - Viktor Joras

1

什么是“Unicode编码”?

Unicode是一个字符集;在Unicode和字节之间有许多编码方式,其中许多只映射可能字符的子集。

当您想在PHP脚本中使用非ASCII Unicode字符时,通常最好的编码选择是UTF-8,因为它是一个ASCII超集编码(即每个字节的较低128个值始终表示标准ASCII字符),可以表示任何Unicode字符。像许多其他面向字节的工具一样,PHP只能可靠地使用ASCII超集编码。

如果您所说的“Unicode编码”是指记事本和其他Windows工具称为“Unicode”的东西,那就是完全不同的命题。这是对UTF-16LE编码的错误称呼。该编码具有每个代码单元两个字节的宽度,这意味着例如普通ASCII字符之间没有字节。它不是ASCII超集,因此PHP和其他基于字节的工具无法直接处理它。

在Windows编辑器中保存脚本时,请尝试以UTF-8(无BOM)格式保存,并使用UTF-8 Content-Type字符集提供页面。虽然它是Windows、Java和JavaScript的默认内存表示,但UTF-16LE对于存储文件或提供网页几乎没有用处。


2
有许多编码方式可以在Unicode和字节之间进行转换,其中许多仅映射可能字符的子集——这是完全错误的。任何有效的Unicode编码都允许使用除了那些Unicode指定为不适合开放交换的极少数字符以外的所有字符,因此您可以将它们用作内部标记。UTF-8、UTF-16和UTF-32都编码了所有Unicode字符。如果不能编码,则不是Unicode编码。ASCII编码了前128个代码点;ISO-8859-1编码了前256个代码点。这绝不意味着它们是Unicode编码。 - tchrist

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接