我有一个 MySql 数据库,它存储使用 XML 类型格式(即 nnnnn; )编码的 Unicode 字符的字符串。这些字符串之一的示例如下: 概述代表 Unicode 字符:概述
如果我按照以下格式对字符串进行硬编码,Perl 允许我在应用程序中进行此转换:
\x{6982}\x{8ff0}
甚至:\N{U+6982}\N{U+8ff0}
对我来说,从 nnnnn; 更改格式似乎是一个简单的问题。到\x{nnnn}
Perl 应用程序似乎需要十六进制数字,而 MySql 则输出整数。
我想在正则表达式中进行这个简单的转换。所以我使用以下方法匹配整数:
m/\&\#(\d{3,5});/;
然后我使用以下方法将匹配项转换为十六进制:
sprintf('{%04x}',$1)
然后我添加了必要的:\x{ }
我可以轻松创建包含以下内容的字符串:“\x{6982}\x{8ff0}”
但应用程序没有将它们打印为 Unicode。它们在创建时就被简单地打印出来:符号和文本。
我发现如果你将这些字符串硬编码到程序中,Perl 会将它们“插入”到 Unicode 字符中。但如果它们被创建为字符串,则不会发生“插值”。
我尝试使用各种函数强制插值,例如:
编码::解码('UTF-8', "某个字符串");
编码::编码('UTF-8', "某个字符串");
但这并不是这些函数的目的。
我还尝试使用 Perl 的手动字符串插值
$v="${ \($v) }";
但这并没有将字符串“\x{6982}\x{8ff0}”转换为 Unicode。它只是保持与以前相同的字符串。
我遇到了一个使用“eval()”的示例。
while($unicodeString =~ m/\&\#(\d{3,5});/) {
$_=$unicodeString; ## in the XML form of (spaces added so you could see it here): & #27010; & #36848;
m/\&\#(\d{3,5});/; ## Matches the integer number in the Unicode
my $y=q(\x).sprintf('{%04x}',$1); ## Converts the integer to hex and adds the \x{}
my $v = eval qq{"$y"}; ## Performs the interpolation of the string to get the Unicode
$unicodeString =~ s/\&\#(\d{3,5});/$v/; ## Replaces the old code with the new Unicode character
}
此转换现在有效。但我对重复使用 eval() 来转换每个字符不满意:一次一个。我可以在 While 循环中构建字符串,然后简单地 eval() 新字符串。但我更愿意只使用 eval() 那些在正则表达式中专门匹配的小字符串。
是否有更好的方法将 XML 字符串(Unicode 字符显示为整数)转换为包含实际 Unicode 字符的字符串?
如何轻松地从包含以下内容的字符串开始:
我认识到自己的长处和短处 65292;并追求自我发展。
发送至:
我认识到自己的长处和短处,并 self 追求发展。
我需要转换的文档包含数千个这样的字符。
最佳答案
这是一个简单的示例,说明如何使用 chr
替换 unicode 转义符。功能:
use feature qw(say);
use strict;
use warnings;
use open qw( :encoding(utf-8) :std );
my $str = "概述";
$str =~ s/&#(\d+);/chr $1/eg;
printf "%vX\n", $str;
say $str;
输出:
6982.8FF0
概述
关于string - Perl:将字符串转换为 Unicode,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68989887/