gpt4 book ai didi

perl - 在 Perl 中规范化 Unicode 字符串

转载 作者:行者123 更新时间:2023-12-05 00:00:28 25 4
gpt4 key购买 nike

我想将一些来自 UTF-8 数据库的文本输出到 CP1252(又名 Latin1)文件中。为此,我使用 Text::Iconv 工作正常 除非 要转换的字符串中的字符被分解。这是否是 iconv 库的失败是我提出的一个问题,答案并不明显。由于 iconv 在组合字符上工作正常,解决方案是先规范化我的字符串,但我似乎无法做到:

use strict;
use warnings;
use Data::Hexdumper qw(hexdump);
use Unicode::Normalize;

my $v = "É"; # E=U+0045 followed by combining ´=U+0301. UTF-8: 0x45CC81
print "'$v'\n";
print hexdump($v);

my $n = NFC $v; # should be É=U+00C9. UTF-8: 0xC389
print "'$n'\n";
print hexdump($n);

但这是我得到的输出:
'É'
0x0000 : 45 CC 81 00 00 00 00 00 00 00 00 00 00 00 00 00 : E...............
'É'
0x0000 : 45 CC 81 00 00 00 00 00 00 00 00 00 00 00 00 00 : E...............

换句话说,NFC(转换为规范化形式 C)函数没有做任何事情。我错过了什么吗?我在 Mac OS X 10.7.3 上使用 Perl 5.12.3。

这只是我在 Perl 中处理文本的问题的开始,这是我没想到的。谢谢你的帮助。

编辑:一些上下文似乎很有用。当然, use utf8 对我设计的例子有很大帮助。条款。我的实际问题当然不是字符串文字。

首先,我从答案中意识到我需要了解很多关于 Perl 的知识。事实上,我不是 Perl 程序员,而是一个 Objective-C/Cocoa 程序员,根本不会出现这些问题。

所以我开始阅读,我发现 Perl 文档很困惑,例如当它谈到与 UTF-8 不同的 native 编码时。它没有说的是如何为 UTF-8 是 native 编码的 Mac OS X 平台转换它。

在任何情况下,上下文都是我的程序在文本文件中生成输出,这些文件可以具有多种格式(包括 csv 和 Unimarc)和多种编码(四种最常见的是 UTF-8、CP1252、MARC8 和 ISO-5426)。用户的选择。

它从某个数据库(当前是 mySQL 或 SQL Server)获取输入,其中数据通常以 UTF-8(但有时以 CP1252)编码。

最佳答案

你缺少的是 $v设置为“E”字符和 utf-8 编码 组合重音符号,而不是组合重音符号本身。为了解决这个问题,你需要做类似的事情

1) use utf8 -- 使 Perl 自动 utf-8 解码你的源代码

2) 显式解码 $v

my $v = chr(0x45) . chr(0xCC) . chr(0x81);
use Encode;
$v = Encode::decode('utf-8', $v); # now $v is 0x45 0x301

3) 使用 chr明确设置 $v你的意思
my $v = chr(0x45) . chr(0x301);

我不会真正推荐数字 (2),但我将其包含在内以说明当您不使用时脚本会发生什么 use utf8 .

关于perl - 在 Perl 中规范化 Unicode 字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10127987/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com