【问题标题】:Perl strings encode utf 8Perl 字符串编码 utf 8
【发布时间】:2013-06-17 10:18:04
【问题描述】:

我正在阅读有关 Perl 的 Encode 和 utf8 的信息。

文档说:

$octets = encode_utf8($string);

相当于

$octets = 编码("utf8", $string) 。

$string 中的字符以 Perl 的内部格式编码,并且 结果作为八位字节序列返回。

我不知道这意味着什么。无论如何,Perl 中的字符串不是八位字节序列(即字节)吗?

那么有什么区别:

$string$octets?

【问题讨论】:

    标签: string perl utf-8 encode


    【解决方案1】:

    不,Perl 中的字符串是字符的序列,不一定是八位字节。 chrord 函数(用于在整数和单个字符之间进行转换),仅举两个例子,可以处理大于 255 的整数值。例如

    $string = "\x{0421}\x{041F}";
    print ord($_)," " for split //, $string;
    

    输出

    1057 1055
    

    当将字符串写入终端、文件或其他输出流时,接收字符串的设备通常需要并期望字节,因此这就是编码的用武之地。如您所见,UTF-8 是一种将 0x7F-0x10FFFF 范围内的单个值编码为多个字节的方案。

    $octets = Encode::encode("utf-8", "\x{0421}\x{041F}");
    print ord($_)," " for split //, $octets;
    

    现在输出是

    208 161 208 159
    

    并且适合存储在文件系统上。

    在内部,perl(全小写,指 Perl 的可执行实现,编程语言规范)经常使用 UTF-8 来表示带有“宽”字符的字符串,但这并不是你每个人都会这样做的平时不用担心。

    【讨论】:

    • \x{0421} 是什么意思?
    • \x{0421} 是编码为十六进制数 0x421 的字符。这显然是“西里尔大写字母 ES”(参见 fileformat.info/info/unicode/char/421
    • 那么为什么不用decode 而不是在这里编码解码成 Perl 字符呢?
    • “UTF-8 字符”不是一个东西。有 Unicode 代码点(从 0-0x10FFFF),还有一种 UTF-8 编码,将所有 Unicode 代码点表示为一个或多个八位字节(字节)。当您使用substrchopsplit、正则表达式或任何其他作用于字符串的 Perl 功能时,您就是在处理字符。
    • ...您不必关心这些字符最初是来自 UTF-8 还是 latin-1 或任何来源。
    猜你喜欢
    • 2020-11-29
    • 2014-06-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多