繁体   English   中英

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

[英]How to handle character encoding in PHP - Codeigniter?

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

我有一个简单的表单,用户可以使用HTML进行传递,HTML可以采用任何语言,并且可以采用任何字符编码格式。

我的问题是:

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

  • 如何有效地将任何字符编码转换为UTF-8,以便可以使用PHP字符串函数进行解析并将其保存到数据库中,然后使用htmlentities进行回显?

我正在尝试找出如何最好地实现这一点-建议和链接表示赞赏。

我正在使用Codeigniter及其输入类来检索帖子数据。

我应该指出几点:

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

<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. 准备要与UTF-8一起使用的PHP应用程序
  2. 如何在PHP中检测格式错误的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");

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

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

编辑:

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保存到数据库之前,可以使用utf8_encode (因为该系统主要是为西欧语言设置的,因此通常为ISO-8859-1或其紧密关系ref )。

// 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';

暂无
暂无

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

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