再一次,我对unicode问题非常困惑.我无法弄清楚如何成功使用unicodedata.normalize按预期转换非ASCII字符.例如,我想转换字符串
u"Cœur"
Run Code Online (Sandbox Code Playgroud)
至
u"Coeur"
Run Code Online (Sandbox Code Playgroud)
我很确定unicodedata.normalize是这样做的方法,但我不能让它工作.它只是保持字符串不变.
>>> s = u"Cœur"
>>> unicodedata.normalize('NFKD', s) == s
True
Run Code Online (Sandbox Code Playgroud)
我究竟做错了什么?
python unicode normalization unicode-normalization python-2.7
这个问题与文本编辑有关。假设您有一段标准化形式的NFC文本,以及一个指向文本中扩展字素簇边界的光标。您想在光标位置插入另一段文本,并确保生成的文本也在 NFC 中。您还希望将光标移动到紧跟在插入文本之后的第一个字素边界上。
现在,由于连接两个都在 NFC 中的字符串不一定会生成也在 NFC 中的字符串,因此您可能需要修改插入点周围的文本。例如,如果您有一个包含 4 个代码点的字符串,如下所示:
[0] LATIN SMALL LETTER B
[1] LATIN SMALL LETTER E
[2] COMBINING MACRON BELOW
--- Cursor location
[3] LATIN SMALL LETTER A
Run Code Online (Sandbox Code Playgroud)
并且您想{COMBINING ACUTE ACCENT, COMBINING DOT ABOVE}在光标位置插入一个 2-codepoints 字符串。那么结果将是:
[0] LATIN SMALL LETTER B
[1] LATIN SMALL LETTER E WITH ACUTE
[2] COMBINING MACRON BELOW
[3] COMBINING DOT ABOVE
--- Cursor location
[4] LATIN SMALL LETTER A
Run Code Online (Sandbox Code Playgroud)
现在我的问题是:在插入字符串后,您如何确定应该将光标放置在哪个偏移量处,从而使光标在插入的字符串之后结束并位于字素边界上?在这种特殊情况下,在标准化期间,光标位置后面的文本不可能与前面的文本交互。因此,以下示例 Python 代码将起作用:
import unicodedata
def …Run Code Online (Sandbox Code Playgroud) 我得到的一些字符串是UTF-8编码,并包含一些特殊字符,如Å¡,Ä',Ä等.我用StringReplace()它来转换为一些普通文本,但我只能转换一种字符.因为PHP还有一个替换字符串的功能,如下所示:如何用PHP中的特殊字符替换特殊字符?,但它支持数组:
<?php
$vOriginalString = "¿Dónde está el niño que vive aquí? En el témpano o en el iglú. ÁFRICA, MÉXICO, ÍNDICE, CANCIÓN y NÚMERO.";
$vSomeSpecialChars = array("á", "é", "í", "ó", "ú", "Á", "É", "Í", "Ó", "Ú", "ñ", "Ñ");
$vReplacementChars = array("a", "e", "i", "o", "u", "A", "E", "I", "O", "U", "n", "N");
$vReplacedString = str_replace($vSomeSpecialChars, $vReplacementChars, $vOriginalString);
echo $vReplacedString; // outputs '¿Donde esta el nino que vive aqui? En el tempano o en el iglu. AFRICA, …Run Code Online (Sandbox Code Playgroud) 我们编写一个C++应用程序,需要知道这个:
UTF8文本是否编码从字节到字符的内射映射,这意味着每个字符(字母...)只以一种方式编码?因此,例如字母'Ž'不能编码为3231和32119.
我试图使用PHP 5.3中引入的normalizer_normalize()函数(说文档),但我不能使用它:
$ php -r 'echo normalizer_normalize("tést");'
PHP Fatal error: Call to undefined function normalizer_normalize()
in Command line code on line 1
Run Code Online (Sandbox Code Playgroud)
我检查了我的PHP版本,但它是5.3:
$ php --version
PHP 5.3.6 (cli) (built: Sep 12 2011 18:02:42)
Run Code Online (Sandbox Code Playgroud)
我不明白为什么PHP找不到它?
我一直在阅读关于Unicode的主题,但我仍然对规范化及其不同形式感到困惑.简而言之,我正在开展一个项目,涉及从PDF文件中提取文本并执行一些语义文本分析.
我已经设法使用一个简单的python脚本令人满意地提取文本,但现在我需要确保所有等效的正交字符串都有一个(并且只有一个)表示.例如,'fi'印刷结扎应该分解为'f'和'i'.
我看到python的unicodedata.normalize函数提供了几种算法来规范化unicode代码点.有人可以解释之间的区别:
我阅读了相关的维基百科文章,但对于我虚弱的大脑来说,它太不透明了.有人可以用简单的英语向我解释这个吗?
另外,您能否为最适合自然语言处理项目的规范化方法提出建议?
python unicode normalization unicode-normalization text-normalization
我的测试告诉我,从Unicode 6.2开始,完全兼容性分解中的所有字符都具有NFD_Quick_Check = Yes属性.
这使我相信isNFKD(x)暗示isNFD(x),而isNFKC(x)暗示isNFC(x).
我的结论是否正确?稳定性怎么样?对于Unicode标准的未来版本,这些含义是否可以保证?
我有一个混合使用unicode字符\ u0421,'С'和\ u0043,'C'的数据集.是否有某种unicode比较,认为这两个字符相同?到目前为止,我已经尝试了几种ICU整理,包括俄罗斯的整理.
unicode collation normalization unicode-normalization accent-insensitive
在Ruby,Javascript和Java(其他我没试过)中,有西里尔字符Я̆Я̄Я̈长度2.当我尝试用这些字符检查字符串的长度时,我的输出值很差.
"??".mb_chars.length
#=> 2 #should be 1 (ruby on rails)
"??".length
#=> 2 #should be 1 (ruby, javascript)
"?".length
#=> 1 #correct (ruby, javascript)
Run Code Online (Sandbox Code Playgroud)
请注意,字符串以UTF-8编码,每个字符串都表现为单个字符.
我的问题是为什么会有这样的行为,如何在这些字符内正确获取字符串的长度?