如何处理字符编码在PHP - Codeigniter


How to handle character encoding in PHP - Codeigniter?

将用户输入转换为UTF-8的最佳方法是什么?

我有一个简单的表单,用户将在HTML中传递,HTML可以是任何语言,它可以是任何字符编码格式。

我的问题是:
  • 是否可以将所有内容表示为UTF-8?

  • 我可以使用什么来有效地将任何字符编码转换为UTF-8,以便我可以用PHP字符串函数解析它并将其保存到我的数据库,随后使用htmlentities回显?

我正在努力找出如何最好地实现这一点-建议和链接感谢。

我正在使用Codeigniter和它的输入类来检索post数据。

我应该说明的几点:

  • 我需要将HTML特殊字符转换为它们各自的实体
  • 接受编码并以相同的编码返回可能是一个好主意。但是,我的web应用程序正在使用:

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

这可能会对事情产生不利影响。

<form>标签中指定accept-charset,告诉浏览器提交用户输入的编码为UTF-8的数据:

<form action="foo" accept-charset="UTF-8">...</form>

在这里查看如何在整个Web堆栈中使用UTF-8的完整指南。

是否可以将所有内容表示为UTF-8?

是的,UTF-8是Unicode编码,所以你可以使用Unicode中定义的任何字符。这是迄今为止你能用电脑做的最好的事情了。

我可以使用什么来有效地将任何字符编码转换为UTF-8

iconv允许您将几乎任何编码转换为任何其他编码。但是,你必须知道你在处理什么编码。你不能说"iconv,不管它是什么,让它成为UTF-8!"。不幸的是,事实并非如此。你只能说"iconv,我这里有一个BIG5格式的字符串,请将其转换为UTF-8。"

如果您只处理UTF-8格式的表单数据,那么您可能永远不需要转换任何内容。

这样我就可以用PHP字符串函数解析

PHP字符串函数"处理字节。它们不关心字符或编码。根据您想要做的事情,在UTF-8文本上使用简单的PHP字符串函数会给您带来不好的结果。对于任何多字节编码字符串操作,使用MB扩展中的编码感知字符串函数。

保存到我的数据库

只是确保你的数据库存储文本在UTF-8,你已经设置你的数据库连接到UTF-8(即数据库知道你发送它UTF-8数据)。您应该能够在CodeIgniter数据库连接设置中指定它。

随后使用htmlentities?

只要echo htmlentities($text),你不需要做更多的事情。

然而,我的web应用程序正在使用:<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

这可能会对事情产生不利影响。

一点也不。它只是向浏览器发出信号,表明您的页面是用UTF-8编码的。现在您只需要确保这是实际情况(无论如何您都在尝试这样做)。它还向浏览器暗示应该向服务器发送UTF-8。您可以在表单上使用accept-charset属性显式设置。

我可以推荐每个程序员绝对需要知道的关于编码和字符集的文本工作,这可能有助于你理解更多。

1)是否有可能将所有内容表示为UTF-8?

是的,所有用UNICODE定义的东西。这是目前你能得到的最多的,将来UNICODE还可以支持。

2)我可以用什么来有效地将任何字符编码转换为UTF-8,以便我可以用PHP字符串函数解析它,并将其保存到我的数据库,随后使用htmlentities回显?

您唯一需要知道的是数据的实际编码。如果你想让你的web应用程序支持UTF-8作为输入和输出,前端需要发出它支持UTF-8的信号。有关您的应用程序用户界面的指南,请参阅字符编码。 在PHP中,您需要为任何函数提供它所支持的编码。有些需要指定编码,有些则需要转换编码。总是检查函数文档是否支持你的请求。另外,检查你的PHP配置。 相关:

  1. 准备PHP应用程序使用UTF-8
  2. 如何检测PHP中格式错误的utf-8字符串?

如果您想更改字符串的编码,您可以尝试

$utf8_string = mb_convert_encoding( $yourBadString , 'UTF-8' );

我发现唯一适用于UTF-8编码的是设置在我的config.php

putenv('LC_ALL=en_US.utf8'); // or whatever language you need
setlocale(LC_ALL, 'en_US.utf8');  // or whatever language you need
bindtextdomain("mydomain", dirname(__FILE__) . "/../language");
textdomain("mydomain");

EDIT:

Is it possible to represent everything as UTF-8?

是的,这些是你需要确保的:

  • html: headers/meta-header设置为utf-8
  • 所有文件保存为utf-8
  • 数据库整理、表和数据编码为utf-8

What can I use to effectively convert any character encoding to UTF-8

您可以在将其保存到数据库之前使用utf8_encode(因为对于主要为西欧语言设置的系统,它通常是ISO-8859-1或其密切相关,参考)。

// eg
$name = utf8_encode($this->input->post('name'));

正如我之前提到的,您需要确保数据库排序、表和数据编码为utf-8。在CI中,在您的数据库连接配置

// Make sure have these lines
$db['default']['char_set'] = 'utf8';
$db['default']['dbcollat'] = 'utf8_general_ci';