加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

在Perl中规范化Unicode字符串

发布时间:2020-12-16 06:18:35 所属栏目:大数据 来源:网络整理
导读:我想将一些来自UTF-8数据库的文本输出到CP1252(又名Latin1)中的文件.为此,我使用Text :: Iconv工作正常,除非要转换的字符串中的字符被分解.这是否是iconv库的失败是我提出的一个问题,答案并不明显.由于iconv在组合字符上工作正常,因此解决方案是首先规范化我
我想将一些来自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中处理文本问题的开始,我不会期望的.谢谢你的帮助.

编辑:一些上下文似乎很有用.当然,使用utf8子句可以帮助我做出很多有用的例子.我的实际问题当然不是字符串文字.

首先,我从答案中了解到,我需要了解很多关于Perl的知识.事实上,我不是Perl程序员,而是Objective-C/C++ocoa程序员,这些问题根本没有出现.

所以我开始读出来,并且我发现Perl文档非常混乱,例如当它谈到本机编码与UTF-8不同时.它没有说的是如何将其转换为UTF-8是本机编码的Mac OS X平台.

在任何情况下,上下文是我的程序在texte文件中产生输出,可以有几种格式(包括csv和Unimarc),以及几种编码(最常见的四种是UTF-8,CP1252,MARC8和ISO-5426).用户的选择.

它从一些数据库(目前是mySQL或SQL Server)获取其输入,其中数据通常以UTF-8编码(但有时在CP1252中).

解决方法

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

1)使用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),但是当我不使用utf8时,我将其作为一种方式来说明你的脚本会发生什么.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读