繁体   English   中英

准备PHP应用程序以与UTF-8一起使用

[英]Preparing PHP application to use with UTF-8

UTF-8现在是Web应用程序的事实标准,但PHP不是PHP的默认编码(直到6.0)。 默认情况下,大多数服务器都设置为ISO-8859-1编码。

如何重载.htaccess的默认设置以确保UTF-8,语言环境等一切顺利? Web服务器的任何选项,Unix操作系统?

这些设置有没有全面的清单? 例如mbstring选项, iconv设置,语言环境等我应该为每个多语言项目设置? 以预定义的.htaccess为例?

(在我的特殊情况下,我需要设置语言:英语,荷兰语和俄语。服务器在乌克兰)。

.htaccess有一些有用的选项:

########################################
# Locale settings
########################################

# See: http://php.net/manual/en/timezones.php
php_value date.timezone "Europe/Amsterdam"

SetEnv   LC_ALL  nl_NL.UTF-8

########################################
# Set up UTF-8 encoding
########################################

AddDefaultCharset UTF-8
AddCharset UTF-8 .php

php_value default_charset "UTF-8"

php_value iconv.input_encoding "UTF-8"
php_value iconv.internal_encoding "UTF-8"
php_value iconv.output_encoding "UTF-8"

php_value mbstring.internal_encoding UTF-8
php_value mbstring.http_output UTF-8
php_value mbstring.encoding_translation On
php_value mbstring.func_overload 6

# See also php functions:
# mysql_set_charset
# mysql_client_encoding

# database settings
#CREATE DATABASE db_name
#   CHARACTER SET utf8
#   DEFAULT CHARACTER SET utf8
#   COLLATE utf8_general_ci
#   DEFAULT COLLATE utf8_general_ci
#   ;
#
#ALTER DATABASE db_name
#   CHARACTER SET utf8
#   DEFAULT CHARACTER SET utf8
#   COLLATE utf8_general_ci
#   DEFAULT COLLATE utf8_general_ci
#   ;

#ALTER TABLE tbl_name
#   DEFAULT CHARACTER SET utf8
#   COLLATE utf8_general_ci
#   ;

你是对的UTF-8是webapplications的不错选择。

编码是获得处理的数据的元信息。 只要你知道(二进制)数据的编码,就知道你在处理什么。 如果您不知道编码,就会开始迷路。 我经常将其称为链,如果编码链断开,数据将被破坏。 这对于显示数据和安全性都是如此。

根据经验,PHP是二进制的,它是指定编码的上下文/你(例如你如何保存你的php源代码文件)。

那么让我们来处理一个简短(不完整)的列表:

操作系统

环境变量可能会告诉您正在使用的语言环境和编码。 例如,文件系统对文件和目录的名称进行编码。 我对这个主题不是很坚定,通常我们试着用英文命名我们的文件,所以只使用US-ASCII范围内的US-ASCII ,这对于你的情况下的拉丁语扩展字符集如ISO-8859-1也是安全的。至于UTF-8

保存用户上传的文件时请记住这一点:只需将文件名过滤为基本字母和标点符号,您几乎不会有麻烦( azAZ0-9.-_ ),甚至将它们全部小写用于视觉目的。

如果您觉得这会降低可用性并且文件系统不提供UTF-8的unicode字符范围,您可以回rawurlencode (Percent-Encoding,triplet)等简单编码,并通过解析该名称来提供要下载的文件到磁盘。

通常你只需要处理你拥有的东西。 开始向常见的系统管理员或程序员询问字符编码,大多数人都会告诉你他们并不是真正感兴趣。 当然这是主观的,但如果你需要有人为你配置一些东西,这可能会有所不同。

HTML

这仅仅是PHP独立的,它是关于脚本提供的输出所以工作领域。

经验法则是:指定它。 如果你没有指定它(HTML文件,CSS文件,Javascript文件),不要指望它能正常工作。 那就做吧。 编码是一个链,如果有很多组件,确保每个人都知道它的编码。 否则浏览器只能猜测。 UTF-8是一个不错的选择,但我们的工作是保持精确和明确。

PHP设置

作为一般经验法则,请开始阅读随Linux发行版的PHP包附带的php.ini文件。 它附带可读文档的评论和更多链接。 我想到的一些设置:

字符串

回答您的问题:设置和参数的需求总是取决于您使用的组件。 对于浏览器或网络服务器等常规设备,可以提供推荐设置以使其配置为UTF-8 但其他一切都取决于它。 最重要的是寻找它并确保您知道编码并可以配置/指定它。 通常它是记录在案的。 只要您不需要处理可移植代码,就可以更加简单,因为您可以控制环境,或者只需要处理特定环境。 编写代码时考虑到编码的防御性,你应该没问题。

  1. 您的所有文件都必须使用代码编辑器以UTF-8(无BOM)保存。
  2. Web服务器可能配置为发送不适当的标头,因此建议在应用程序级别覆盖它们。 例如:

     header('Content-Type: text/html; charset=utf-8'); 
  3. 添加HTML元内容类型:

     <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> 
  4. 使用htmlspecialchars()而不是htmlentities()因为前者在utf-8中足够,而后者在默认情况下与utf-8不兼容。

  5. 不要使用PHP标准字符串函数,因为其中许多函数与utf-8不兼容。 尝试在Multibyte String或其他库中找到它们的对应物。 (在使用它之前不要忘记为库设置默认字符集,因为该库支持许多编码,而utf-8只是其中之一。)
  6. 对于正则表达式,使用u修饰符。 例如:

     preg_match('/ž{3,5}/u', $string, $matches); 

    这是检查给定字符串是否有效utf-8字符串的最可靠方法:

     if (@preg_match('//u', $string) === false) { // NOT valid! } else { // Valid! } 
  7. 如果使用数据库,则始终在建立连接后立即设置适当的连接编码。 MySQL的示例:

     mysql_set_charset('utf8', $link); 

    还要检查数据库中的列是否在utf-8中。 它并不总是需要,但建议。

基本上我用捷克语做了三件事:

1)在PHP中定义语言环境:

setlocale(LC_COLLATE, "cs_CZ");
setlocale(LC_CTYPE, "cs_CZ");

所以你会使用类似的东西:

setlocale(LC_ALL, "en_US.utf8");
setlocale(LC_ALL, "nl_NL.utf8");

基于当前切换到的语言。

2)为数据库定义charset:

mysql_query("set names latin2 collate latin2_czech_cs");

3)定义PHP / HTML代码的字符集:

<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-2">

我没有使用任何.htaccess设置。 您可以根据您的情况修改此项,在语言环境中使用类似en_US.utf8 (基于当前切换到的语言),在charset中使用utf-8而不是latin2 / iso-8859-2,它应该可以正常工作。

请尝试以下方法之一:

 AddDefaultCharset UTF-8
 AddCharset UTF-8 .php

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM