mjn*_*mjn 4 svn delphi unicode vcl delphi-xe2
Subversion的Wikipedia条目包含一个关于Unicode编码的不同方式问题的段落:
虽然Subversion将文件名存储为Unicode,但它没有指定是否对某些重音字符(例如é)使用了预编译或分解.因此,在某些操作系统(例如OS X)上运行的SVN客户端中添加的文件使用分解编码,而在其他操作系统(例如Linux)上运行的客户端使用预编译编码,结果是这些重音字符无法正确显示本地SVN客户端没有使用与用于添加文件的客户端相同的编码
虽然这描述了Subversion客户端实现的一个特定问题,但我不确定基础Unicode组合问题是否也会出现在常规Delphi应用程序中.我想只有Delphi应用程序能够使用两种Unicode编码方式(可能在Delphi XE2中)时才会出现问题.如果是的话,Delphi的开发人员可以做些什么来避免它呢?
有一个小问题,因为在Windows上使用的许多字体都不会以理想的方式呈现分解的形式,通过使用字母和变音符号的组合字形.相反,它回退到渲染字母,而不是将独立的变音符号叠加在顶部,这通常会导致视觉上不那么令人愉悦,可能是不平衡的字形.
然而,这不是wiki引用的Subversion错误所引发的问题.检查包含组合或分解字符序列的SVN的文件名实际上是完全正确的; SVN既不知道也不关心组合,它只是按原样使用Unicode代码点.只要后端文件系统使文件名处于与它们放入的状态相同的状态,一切都很好.
Windows和Linux都有文件系统,对组合同样无视.不幸的是,Mac OS X没有.在存储传入文件名之前,HFS +和UFS文件系统都会对分解形式执行"规范化",因此您获取的文件名不一定与您输入的Unicode代码点序列相同.
正是这种[IMO:疯狂]行为混淆了SVN和许多其他程序 - 在OS X上运行时.它特别容易被咬,因为Apple碰巧选择分解(NFD)作为其标准化形式,而其余的大多数世界使用组合(NFC)字符.
(它甚至不是真正的NFD,而是一种不兼容Apple的变种.快乐.)
解决这个问题的最好方法是,如果可以的话,永远不要依赖存储在其中的确切文件名.如果您只读取给定名称的文件,那很好,因为它将被标准化以匹配当时的文件系统.但是,如果您正在阅读目录列表并尝试将您在其中找到的文件名与您期望的文件名匹配 - 这正是Subversion所做的 - 您将会遇到不匹配问题.
为了可靠地进行文件名匹配,您必须检测到您在OS X上运行,并在进行比较之前手动将文件名和字符串规范化为某种正常形式(NFC或NFD).您不应该在将这两种形式视为不同的其他操作系统上执行此操作.