perl - 在 Perl 中将 UTF8 字符串转换为数值

标签 perl unicode utf-8 codepoint

例如,

my $str = '中國c'; # Chinese language of china

我想打印出数值
20013,22283,99

最佳答案

unpack 会比split更有效率和 ord ,因为它不必制作一堆临时的 1 个字符的字符串:

use utf8;

my $str = '中國c'; # Chinese language of china

my @codepoints = unpack 'U*', $str;

print join(',', @codepoints) . "\n"; # prints 20013,22283,99

快速基准测试表明它比 split+ord 快约 3 倍:
use utf8;
use Benchmark 'cmpthese';

my $str = '中國中國中國中國中國中國中國中國中國中國中國中國中國中國c';

cmpthese(0, {
  'unpack'     => sub { my @codepoints = unpack 'U*', $str; },
  'split-map'  => sub { my @codepoints = map { ord } split //, $str },
  'split-for'  => sub { my @cp; for my $c (split(//, $str)) { push @cp, ord($c) } },
  'split-for2' => sub { my $cp; for my $c (split(//, $str)) { $cp = ord($c) } },
});

结果:
               Rate  split-map  split-for split-for2     unpack
split-map   85423/s         --        -7%       -32%       -67%
split-for   91950/s         8%         --       -27%       -64%
split-for2 125550/s        47%        37%         --       -51%
unpack     256941/s       201%       179%       105%         --

使用较短的字符串时,差异不太明显,但 unpack仍然是两倍多。 ( split-for2 比其他拆分快一点,因为它不构建代码点列表。)

关于perl - 在 Perl 中将 UTF8 字符串转换为数值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3542449/

相关文章:

mysql - 使用ASP和MySQL设置字符集

perl - 如何设置正确的perl路径

android - 如何将数据从 Perl 发送到 Python

unicode - 将 unicode 代码点转换为 Go 中的文字字符

c - 为什么地址栏中的 UTF-8 Unicode 与 GET 形式在 C 中有所不同?

C++ 和带有国家符号的文件路径(可能用 utf8 编码)

Perl:哈希片不能按词法作用域

perl - 为什么 Moose 代码这么慢?

string - 确定字符串是否包含字符的最快方法

python - 处理 Django 上传文件中的 UTF-16