gpt4 book ai didi

string - 如何使用 Unicode::Normalize 创建最兼容的 windows-1252 编码字符串?

转载 作者:行者123 更新时间:2023-12-02 01:00:01 24 4
gpt4 key购买 nike

我有一个 Perl 遗留应用程序,处理以 UTF-8 编码的 XML最有可能的是,它需要在某个数据库中存储该 XML 的一些数据,该数据库使用 windows-1252由于历史原因。是的,这个设置不能支持 Unicode 标准的所有可能的字符,但实际上我不需要,并且可以尝试合理兼容。

当前的具体问题是一个包含 LATIN SMALL LETTER U, COMBINING DIAERESIS 的文件( U+0075 U+0308 ),这使得 Perl 将 Unicode 字符串的现有编码打破为 windows-1252但以下情况除外:

"\x{0308}" does not map to cp1252

我能够使用 Unicode::Normalize::NFKC 解决这个问题,这会创建字符 U+00FC ( ü ),它完美地映射到 windows-1252 。这当然会导致其他一些问题,例如如果是字符 VULGAR FRACTION ONE HALF ( ½U+00BD ),因为 NFKC创建DIGIT ONE, FRACTION SLASH, DIGIT TWO ( 1/2U+0031 U+2044 U+0032 )为此,Perl 再次死亡:

"\x{2044}" does not map to cp1252

根据normalization rules ,这非常适合 NFKC 。我使用它是因为我认为它会给我最兼容的结果,但这是错误的。使用NFC相反,解决了这两个问题,因为两个字符都提供了 normalizationwindows-1252 兼容在这种情况下。

对于规范化与 windows-1252 兼容的字符,此方法还会产生额外的问题。一般都可用,仅与NFC不同。一个例子是 LATIN SMALL LIGATURE FI ( U+FB01 )。据其normalization rules ,是 NFC 之后的表示与 windows-1252 不兼容,同时使用NFKC这次结果是两个与 windows-1252 兼容的字符:fi (U+0066 U+0069)。

我当前的方法是简单地尝试编码为 windows-1252照原样,如果失败,我将使用 NFC然后再试一次,如果失败我正在使用 NFKC然后再试一次,如果失败我现在就放弃。这适用于我当前正在处理的情况,但如果上面示例中的所有三个字符同时出现在字符串中,则显然会失败。总有一个字符会导致 windows-1252 - 不兼容的输出,无论 NFC 的顺序如何和NFKC 。唯一的问题是哪个字符何时中断。

但重要的是,每个字符本身都可以标准化为与windows-1252兼容的东西。 。只是似乎没有一劳永逸的解决方案。

那么,是否有一些我缺少的 API,它已经以最向后兼容的方式进行转换?

如果没有,我需要采取什么方法来支持一个字符串中的所有上述字符?

听起来我需要逐个 Unicode 字符处理每个字符串,并使用与 windows-1252 最兼容的内容单独进行规范化。然后再次连接结果。是否有一些增量 Unicode 字符解析器可以处理组合字符和已经存在的东西?一个简单的基于 Unicode 字符的正则表达式是否已经可以处理这个问题了?

Unicode::Normalize提供额外的功能来处理 partial strings等等,但我必须承认我目前并不完全理解他们的目的。这些示例也侧重于串联,但根据我的理解,我首先需要一些解析才能以不同的方式规范化单个字符。

最佳答案

我不认为您缺少 API,因为相当涉及尽力而为的方法。我会尝试如下操作:

  • 使用 NFC 实现正常化。这结合了分解的序列,如拉丁文小写字母 U、组合分音符。
  • 使用正则表达式 /\PM/g 提取未组合标记的所有代码点。这会丢弃 NFC 转换后剩余的所有组合标记,无论如何都无法转换为 Windows-1252。然后对于每个代码点:
    • 如果代码点可以转换为 Windows-1252,请执行此操作。
    • 否则尝试使用 NFKC 标准化代码点。如果 NFKC 映射与输入不同,则对结果字符串递归应用所有步骤。这可以处理诸如连字之类的事情。
    • 作为奖励:如果代码点在 NFKC 下不变,请转换为 NFD 并尝试将结果的第一个代码点转换为 Windows-1252。这会将 Ĝ 等字符转换为 G。
    • 否则忽略该字符。

当然还有其他方法可以将不受支持的字符转换为看起来相似的字符,但它们需要手动创建映射。

关于string - 如何使用 Unicode::Normalize 创建最兼容的 windows-1252 编码字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54260170/

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