代码之家  ›  专栏  ›  技术社区  ›  David

何时实际应用字符编码?

  •  0
  • David  · 技术社区  · 9 月前

    存在许多描述字符编码最佳实践和比特序列的资源,但如果没有内容旅程的准确地图,我很难理解和应用它们。

    • 我知道如何告诉我的代码编辑器以UTF-8保存文件。
    • 我知道如何在HTML中包含字符编码元标记。
    • 我知道如何为表单声明字符编码。

    但我的思维模式缺少了很多步骤!

    我附上了一张图表来说明。紫色是服务器;红色是浏览器;绿色是操作系统(图中为Windows XP,但可以是任何东西)。

    Server sends data (1) to a browser (2) running on an operating system to generate a webpage containing a form (3) with an input (4) into which an em-dash and right single quotation have been entered, along with regular ASCII characters, above a submit button (5) which will send data back to the server (6)

    1. PHP在响应中发送什么 (体内)?
      • 它是否发送了从我的代码编辑器中收到的内容,并假设回显的字符是有效的?
      • 它是否使用我告诉它我写文件时使用的编码进行回声?
      • 它是否采用标准化的HTTP编码?
    2. 当客户端浏览器接收到服务器数据时 ,是不是。。。
      • 是否扫描响应标头中的字符编码值?
      • 假设一个标准化的HTTP编码,直到它到达我的元标签?(如果找到,它会重新解码之前的内容吗?)
      • 输出 确切地 它依靠用户操作系统来处理编码,收到了什么?
    3. 何时应用表单字符编码? (见下文)
    4. 用户数据是如何通过键盘输入表单的?
      • 操作系统编码(就像浏览器为操作系统输入和显示自己的数据打开了一扇小门)
      • 浏览器编码(以特定于浏览器的格式存储操作系统按键)
      • 表单编码(将操作系统字符转换为表单的声明编码)
      • HTML文档编码(将操作系统字符转换为元标记中的编码)
    5. 浏览器向服务器发布什么?
      • 未修改的用户数据(取决于#4,但可能是原始操作系统编码)
      • 以声明的编码形式编码的用户数据
      • 使用HTML元标签编码的用户数据
      • 标准化HTTP编码的用户数据
    6. 当服务器将数据读回PHP时 ,是不是。。。
      • 从标准化的HTTP编码解码为PHPs运行时编码
      • 根据请求标头中声明的编码解码
      • 未修改的用户数据(完全依赖开发人员处理任何冲突)
    1 回复  |  直到 9 月前
        1
  •  1
  •   deceze    9 月前

    我认为你的思维模式可能缺少的一个重要部分是 字节 人物 在不同的步骤和不同的级别,文本要么被视为不透明、无意义的字节,要么计算机将文本感知为 人物 .

    当计算机将文本视为字符时,它将以某种形式的字节表示存储在内存中,是的,但这是一个无关的实现细节,不同程序在内存中的表示方式可能不同。重要的是,计算机知道“is”,并且可以在任何时候以任何有效的编码生成这些字符的字节表示。

    浏览器

    浏览器是 角色感知 。浏览器内部发生任何事情时,都会将文本视为文本。当它从服务器获取任何文件时, it looks at the HTTP headers or other fallback indicators 为了找出该文件的编码方式,从该编码中解码出来,并将所有文本视为已知的特定字符。

    在表单中输入文本时,操作系统会处理底层细节,包括从键盘接收按键代码,通过所选键盘布局映射这些代码,可能涉及用于文本转换的IME(例如enterè),并向浏览器提供 人物 .

    当需要将这些字符发送到服务器时,浏览器会根据表单等各种因素确定需要使用什么编码 accept-encoding 属性或回退,如网站确定的编码。然后,它将文本表示为该编码中的字节。此时,如果目标编码不能表示字符,则可以用HTML实体替换字符。然后,它可能会对这些字节应用另一种传输编码,如URL百分比编码。然后将其发送到服务器。

    PHP

    默认情况下,PHP不会对编码做任何事情。它不支持文本,并将所有数据视为无意义的字节。因此,您必须确保在代码中知道任何接收到的文本的编码方式,并相应地处理它。PHP 解码URL百分比编码以进行填充 $_GET $_POST ,但这些变量将仅包含已解码的传输 字节 ,而不是文本。

    无论你从PHP输出什么,都会按原样输出。这取决于它来自哪里。来自磁盘上(源代码)文件的任何内容都取决于它在文本编辑器中的保存方式。来自数据库的任何内容都取决于您如何建立数据库连接;数据库通常是文本感知的,将以您请求的编码为您提供文本,您可以对其进行配置。通常最好 ensure everything is in UTF-8 all the way .

    PHP和/或web服务器应确保输出正确的标头,这些标头正确地表示您输出的内容的编码方式,以便浏览器能够正确地确定它。