【问题标题】:How Encoding problems are solves in the web [closed]如何在网络中解决编码问题[关闭]
【发布时间】:2013-08-05 21:42:11
【问题描述】:
我已经开发了 1 年的 web 应用程序,环境是(apache、php、html5 和 javascript)。在此之前我并不关心编码问题。这就像魔法一样。我只是将 mysql 连接设置在一个将配置文件转换为 UTF-8 并忘记。
但是随着经验的增长,我遇到了一些情况,我需要完全了解如何在这种环境中解决编码问题。当我得到一些东西时,我会想念其他的东西。所以我无法获得完整的画面。
说清楚:
- Javascript 字符串是 UTF-16
- HTTP 传输编码是任意的。
- PHP 字符串是二进制的。
- Mysql 连接也是任意的。
转换是如何完成的以及我需要关心的可能问题是什么。
【问题讨论】:
标签:
php
javascript
mysql
web
【解决方案2】:
问题只存在于两个系统之间的边界。在一个系统中(单独的 PHP、数据库、Javascript 等),有明确的方法来处理编码,并且通常没有什么摩擦。问题通常是二进制数据 blob 从一个系统传输到另一个系统,例如 PHP 到数据库,而 没有在随附的元数据中正确指定该 blob 的编码方式。
系统之间的不同接口有不同的方式来指定所需的元数据。 PHP 和数据库之间的接口允许指定连接编码,这使得数据库“了解”PHP 使用什么编码以及它期望返回什么编码。在 Web 服务器/PHP 和浏览器之间有 HTTP 标头和/或 HTML 元标记,允许指定此元数据。
一个系统总是要让步。任何一个系统都以特定编码发送数据,告诉接收者那是什么编码,接收者必须处理它;或者收件人可以预先指定它需要什么编码,并且发件人必须在发送之前将其转换为该编码。
- 在 PHP 和大多数数据库之间,PHP 指定要使用的编码,数据库会即时将文本转换为该编码
- 在 Web 服务器/PHP 和浏览器之间,服务器/PHP 声明它发送的内容采用什么编码,浏览器必须处理它
- 如果浏览器通过表单的
accept-charset 属性发送任何数据,或者浏览器从接收到的内容中推断出它,服务器还会声明它所期望的编码
- Javascript 在浏览器处理后接收文本,因此它并不真正关心编码