标签: unicode-normalization

什么是标准化的UTF-8?

ICU项目(也现在有一个PHP库)包含了帮助恢复正常UTF-8字符串进行搜索时更容易地比较值所需的类.

但是,我试图弄清楚对应用程序意味着什么.例如,在哪些情况下我需要"规范等价"而不是"兼容性等价",反之亦然?

php c unicode unicode-normalization

125
推荐指数
5
解决办法
2万
查看次数

File.listFiles()使用JDK 6修改unicode名称(Unicode规范化问题)

在OS X和Linux上列出Java 6中的目录内容时,我正在努力解决一个奇怪的文件名编码问题:这些File.listFiles()和相关的方法似乎以不同于系统其他部分的编码方式返回文件名.

请注意,不仅仅是这些文件名的显示导致了我的问题.我主要感兴趣的是将文件名与远程文件存储系统进行比较,因此我更关心名称字符串的内容而不是用于打印输出的字符编码.

这是一个演示程序.它创建一个带有Unicode名称的文件,然后打印出从直接创建的文件中获取的文件名的URL编码版本,以及在父目录下列出的相同文件(您应该在空目录中运行此代码).结果显示该File.listFiles()方法返回的不同编码.

String fileName = "Trîcky Nåme";
File file = new File(fileName);
file.createNewFile();
System.out.println("File name: " + URLEncoder.encode(file.getName(), "UTF-8"));

// Get parent (current) dir and list file contents
File parentDir = file.getAbsoluteFile().getParentFile();
File[] children = parentDir.listFiles();
for (File child: children) {
    System.out.println("Listed name: " + URLEncoder.encode(child.getName(), "UTF-8"));
}
Run Code Online (Sandbox Code Playgroud)

这是我在系统上运行此测试代码时得到的结果.请注意%CC%C3角色的表示.

OS X Snow Leopard:

File name: Tri%CC%82cky+Na%CC%8Ame
Listed name: Tr%C3%AEcky+N%C3%A5me

$ java -version
java version "1.6.0_20"
Java(TM) SE …
Run Code Online (Sandbox Code Playgroud)

java unicode normalization file-encodings unicode-normalization

36
推荐指数
1
解决办法
9863
查看次数

Windows中的Unicode规范化

我一直在使用"Unicode字符串"在Windows中,只要是......我了解的Unicode(如毕业).然而,Win32API非常宽松地提到"unicode"总是让我感到困惑.特别是,MSN提到的"unicode"变体是UTF-16(尽管"宽字符"术语来自于它曾经是UCS-2,而不是Unicode).但是,它几乎没有提到Unicode规范化.

MSN有几页关于UnicodeUnicode规范化表单和函数来更改规范化表单.规范化页面甚至说:

Win32和.NET Framework支持所有四种规范化形式.

但是,我没有在文档中找到Win32 API使用(或理解)归一化形式的任何地方.

问题1:默认情况下,用户输入(例如编辑控件)和转换的标准化形式是什么MultiByteToWideChar()

问题2:传递给Win32API函数的字符串必须是特定的规范化形式,还是内核和文件系统规范化无关?

windows unicode normalization unicode-normalization

23
推荐指数
2
解决办法
4023
查看次数

何时使用Unicode规范化形式NFC和NFD?

Unicode规范化常见问题包括以下内容:

程序应始终将规范等效的Unicode字符串比较为相等... Unicode标准提供了可用于此的明确定义的规范化形式:NFC和NFD.

继续......

选择使用哪个取决于特定的程序或系统.NFC是一般文本的最佳形式,因为它与从传统编码转换的字符串更兼容.... NFD和NFKD对内部处理最有用.

我的问题是:

什么使NFC成为"一般文本"的最佳选择.什么定义"内部处理",为什么最好留给NFD?最后,只要使用相同的规范化形式比较两个字符串,两个形式可以互换,从不关注什么是"最佳"?

string unicode normalization unicode-normalization

21
推荐指数
2
解决办法
8123
查看次数

在Python中将unicode文本规范化为文件名等

有没有任何standalonenish解决方案用于将国际unicode文本规范化为Python中的安全ID和文件名?

例如,转My International Text: åäömy-international-text-aao

plone.i18n做很好的工作,但不幸的是它取决于zope.securityzope.publisher和其他一些包使得它十分脆弱的依赖.

plone.i18n适用的一些操作

python unicode plone normalization unicode-normalization

20
推荐指数
1
解决办法
6303
查看次数

当字符串不是字符串?Javascript中的Unicode规范化怪异

在使用.normalize()Unicode规范化函数时,我遇到了Firefox中字符串行为的一些严重怪异.

是一个演示,在Firefox中查看控制台以查看问题.

假设我有一个id为"NFKC"的按钮:

<button id="NFKC">NFKC</button>
Run Code Online (Sandbox Code Playgroud)

得到一个参考,很容易:

document.querySelector('#NFKC')
// <button id="NFKC">
Run Code Online (Sandbox Code Playgroud)

现在,由于此按钮的id为NFKC,我们可以按如下方式获取该字符串:

document.body.querySelector('#NFKC').id
// "NFKC"
Run Code Online (Sandbox Code Playgroud)

将该字符串粘贴在变量中:

var s1 = document.body.querySelector('#NFKC').id
Run Code Online (Sandbox Code Playgroud)

通过比较,直接将相同的字符串分配给变量:

var s2 = 'NFKC'
Run Code Online (Sandbox Code Playgroud)

所以当然:

s1 === s2
// true
Run Code Online (Sandbox Code Playgroud)

和:

s1 == s2
// true
Run Code Online (Sandbox Code Playgroud)

现在是我头部爆炸的部分.

要标准化字符串,您传递的一个NFC,NFD,NFKC,或NFKD.normalize(),就像这样:

'á'.normalize('NFKC')
// "á"
Run Code Online (Sandbox Code Playgroud)

当然,根据您选择的规范化形式,您可以获得不同的代码点,但无论如何.

'á'.normalize('NFC').length == 1
// true
'á'.normalize('NFD').length == 2
// true
Run Code Online (Sandbox Code Playgroud)

但是无所谓.关键是,将对应于规范化形式的四个字符串中的一个传递给.normalize(),然后你将得到一个规范化的字符串.

既然我们知道s1(我们从DOM中检索到的字符串)并且s2是相同的字符串(s1 === s2true),那么显然我们可以使用它们来规范化字符串:

'á'.normalize(s2) …
Run Code Online (Sandbox Code Playgroud)

javascript string unicode firefox unicode-normalization

18
推荐指数
1
解决办法
1656
查看次数

如何使用复合字符正确标准化字符串?

Java Normalize已允许我使用重音字符并输出非重音字符.但是,它似乎并没有完全处理复合字符(Œ,Æ).

有没有办法让Java本地处理这些字符?我想防止必须保留这些字符的映射(因为这是我们首先使用Normalize的原因).

例如,"Œ"的输入应该返回"OE",就像它已经将诸如"½"之类的字符整齐地分解为"1/2"的方式一样.

java unicode-normalization

18
推荐指数
1
解决办法
676
查看次数

如何在Javascript中检查Unicode字符串的相等性?

我在Javascript两个字符串:"_strange_chars_µö¬é@zendesk.com.eml"(f1)和"_strange_chars_µö¬é@zendesk.com.eml"(f2).乍一看,它们看起来完全相同(事实上,在StackOverflow上,它们可能是;我不确定将它们粘贴到这样的形式时会发生什么.)然而,在我的应用程序中,

f1[16] // ö
f2[16] // o
f1[17] // ¬
f2[17] // ?
Run Code Online (Sandbox Code Playgroud)

也就是说,在f1使用ö字符,f2使用一个ö和音调符号¨作为一个单独的字符.我能做什么比较才能证明这两个字符串"相等"?

javascript string unicode normalization unicode-normalization

17
推荐指数
1
解决办法
1866
查看次数

是否可以解释unicodedata.normalize(form,unistr)如何使用示例?

所以在API文档中,http://docs.python.org/2/library/unicodedata.html#unicodedata.normalize.它说

返回Unicode字符串unistr的正常表单形式.表单的有效值为"NFC","NFKC","NFD"和"NFKD"

文档相当模糊,有人可以valid values用一些例子解释一下吗?

python unicode encoding normalization unicode-normalization

17
推荐指数
1
解决办法
1万
查看次数

散列时哪些Unicode规范化(和其他处理)适用于密码?

如果我接受完整的Unicode密码,我应该如何在将字符串传递给哈希函数之前对其进行规范化?

目标

如果没有规范化,如果有人ma\u00F1ana在一台计算机上将其密码设置为"mañana"()并尝试使用ma\u006E\u0303ana另一台计算机上的"mañana"()登录,则哈希将不同,登录将失败.这受用户代理或其操作系统的控制.

  • 我想确保那些哈希到同一个东西.
  • 我并不关心Α,А和A(希腊语,西里尔语,拉丁语)等同性字.

参考

Unicode规范化形式:http://unicode.org/reports/tr15/#Norm_Forms

注意事项

  • 任何标准化过程都可能导致冲突,例如"o?ce" == "office".
  • 规范化可以改变字符串中的字节数.

进一步的问题

  • 如果服务器收到的字节序列不是UTF-8(或其他格式),会发生什么?拒绝,因为它不能正常化?
  • 如果服务器收到其Unicode版本中未分配的字符会发生什么?

passwords unicode password-storage unicode-normalization homoglyph

16
推荐指数
1
解决办法
1323
查看次数