【问题标题】:sending unicode over TCP sockets, what about endianness通过 TCP 套接字发送 unicode,字节序呢
【发布时间】:2014-11-19 19:07:57
【问题描述】:

我在 c 中读取了一个带有一些 unicode 符号 (UTF8) 的字符串。我读取的字符存储在 3 个字节中,因此这些字符不能存储在单个字节中,所以当使用 write 和 read 函数通过 TCP 套接字发送时,我担心这些字符的字节序。我需要对它们做任何特别的事情来确保从流中读取的机器正确解释这些 un​​icode 字符吗?

【问题讨论】:

    标签: c sockets unicode tcp


    【解决方案1】:

    以字节数组的形式发送。对于 UTF8 编码的字符串,字节顺序不应该是问题,因为它们是面向字节的。例如,当您有两个字节并且需要将它们解释为单个值时,字节序很重要。如果您必须单独解释这两个字节,则字节顺序不是问题。

    更多信息:http://unicode.org/faq/utf_bom.html

    问:UTF-8 编码方案是否相同,无论是否 底层处理器是小端还是大端?

    答:是的。由于 UTF-8 被解释为字节序列,因此没有 字节序问题,因为对于使用 16 位或 32 位代码单元。当 BOM 与 UTF-8 一起使用时,它仅用作 将 UTF-8 与其他编码区分开来的编码签名——它 与字节顺序无关。 [自动对焦]

    【讨论】:

    • 字符串是 UTF8 编码是什么意思?而这个 UTF8 字符存储为 3 个字节!
    • @HorseSMith:我的意思是这样的字符串意味着不多,对吧?当您有文本时,它必须以某种方式存储在计算机上。它的存储方式取决于您使用的编码,例如 UTF 8
    • 所以你是说我不应该担心通过 TCP 传输此类字符串时的字节顺序?
    • @HorseSMith:Endian 仅适用于大小大于 1 字节的数值。 UTF-8 不受字节序的影响,因为它是一种 8 位编码方案,而 UTF-16 和 UTF-32 分别是 16 位和 32 位编码方案。 UTF-8 使用 1、2、3 或 4 个 8 位代码单元 对给定的 Unicode 代码点进行编码,因此它不受字节序的影响。 UTF-16 使用 1 个或 2 个 16 位代码单元 进行编码,而 UTF-32 使用 1 个 32 位代码单元 进行编码,因此它们在各个代码单元上都受到字节序的影响.这就是定义 UTF-16LE、UTF-16BE、UTF-32LE 和 UTF-32BE 编码的原因。
    猜你喜欢
    • 1970-01-01
    • 2018-06-13
    • 1970-01-01
    • 2014-07-13
    • 2019-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多