草庐IT

linux - 相同变音符号(变音符号)的不同 UTF-8 签名 - 2 种二进制方式来编写变音符号

coder 2023-06-18 原文

我有一个很大的问题,我在网上找不到任何帮助:

我将一个网站的页面从 OSX 移动到 Linux(两个系统都在 de_DE.UTF-8 中运行)并遇到了一个完全未知的问题: 一些文件不再被发现,但显然存在于硬盘驱动器上(明显)具有相同的名称。所有这些文件都包含德语变音符号。

我拿了一张示例图片,从网页上复制了原始的 request-uri 并直接调用它 - 同样的错误。重写文件名后它起作用了。是的,我没有打错!

这让我很吃惊,我查看了 apache 日志并在其中找到了这些条目:

192.168.56.10 - - [27/Aug/2012:20:03:21 +0200] "GET /images/Sch%C3%B6ne-Lau-150x150.jpg HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_4) AppleWebKit/537.1"
192.168.56.10 - - [27/Aug/2012:20:03:57 +0200] "GET /images/Scho%CC%88ne-Lau-150x150.jpg HTTP/1.1" 404 4205 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_4) AppleWebKit/537.1"

这是我要调查的东西……这是我在 UTF8 图表 http://www.utf8-chartable.de/ 中找到的内容:

ö   c3 b6   LATIN SMALL LETTER O WITH DIAERESIS
¨   cc 88   COMBINING DIAERESIS

我想您已经听说过死键:http://en.wikipedia.org/wiki/Dead_key如果没有,请阅读文章。这很有趣;)

这是否意味着 OSX 将所有变音符号单独保存到字母中?这真的意味着 OSX 将字符 ö 保存为 o 和 ¨ 而不是使用组合产生的真实字符吗?

如果是,您知道我可以用来重命名这些文件的好脚本吗?这不会是我从 OSX 转移到 Linux 的第一页......

最佳答案

它与死键不完全相同,但它是相关的。如您所见,U+00F6 和 U+006F 后跟 U+0308 具有相同的视觉结果。

实际上有 Unicode 规则知道要对它们一视同仁,这是基于分解。字符数据库中有一个分解表,它告诉我们 U+00F6 规范地 分解为 U+006F,然后是 U+0308。

除了规范分解,还有相容性分解。这些丢失了一些信息,例如 ² 最终被分解为 2。这显然是一个破坏性的变化,但当您想要有点模糊时它对搜索很有用(Google 如何知道搜索 fiſh 应该返回有关鱼的结果)。

如果在非组合字符之后有多个组合字符,那么我们可以对它们重新排序只要我们不对同一类的字符重新排序。当我们考虑先在某物上先加一个变音符然后加一个尖音符,还是先加一个变音符然后再加一个变音符并不重要时,这一点就变得很清楚了,但是如果我们在一个字母上同时加上一个尖音符和一个元音变音符,那么显然重要的是什么他们走了。

据此,我们有 4 种规范化形式。在进行比较之前将字符串放入适当的规范化形式,您就不会被绊倒。

NFD:尽可能规范地分解一切,将其分解。按照组合类的顺序对组合字符重新排序,但保持具有相同类的任何字符彼此之间的顺序相同。

NFC:先把所有东西都放进NFD。然后继续按顺序查看组合字符,如果没有同类中较早的字符。如果有等效的单个字符,则替换它们,并重新进行扫描以进一步组合。

NFKD:与 NFD 类似,但使用兼容性分解(破坏性更改,但对如上所述的比较有用)。

NFD:执行 NFKD,然后仅根据 NFC 重新组合规范

还有一些重组被禁止在 NFC 中使用,因此如果 Unicode 添加了更多字符,在一个版本的 Unicode 中是有效 NFC 的文本不会不再是 NFC。

NFD和NFC相比,NFC显然更简洁。它可能不是最简洁的,但它非常简洁并且可以以非常有效的流方式进行测试和/或创建。

Mac OSX 使用 NFD 作为文件名。因为他们是怪人。 (好吧,还有比这更好的论据,他们只是没有说服我!)

Web Character Model 使用 NFC。*因此,您应该尽可能在 Web 内容上使用 NFC。盲目地将东西转换为 NFC 可能会有安全考虑。但如果它从你开始,它应该从 NFC 开始。

任何处理文本的编程语言都应该有一种很好的方法将文本规范化为这些形式中的任何一种。如果您没有提示(或者如果您的是开源的,请贡献!)。

参见 http://unicode.org/faq/normalization.html更多信息,或 http://unicode.org/reports/tr15/了解完整的细节。

*为了额外的乐趣,如果您在 XML 或 HTML 元素内容的开头插入以组合长斜线覆盖 (U+0338) 开头的内容,它会转换标签的 >变成 ,将格式良好的 XML 变成乱码。出于这个原因,网络字符模型坚持每个实体本身必须是 NFC,而不是以组合字符开头。

关于linux - 相同变音符号(变音符号)的不同 UTF-8 签名 - 2 种二进制方式来编写变音符号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12147410/

有关linux - 相同变音符号(变音符号)的不同 UTF-8 签名 - 2 种二进制方式来编写变音符号的更多相关文章

  1. ruby - 在 Ruby 中编写命令行实用程序 - 2

    我想用ruby​​编写一个小的命令行实用程序并将其作为gem分发。我知道安装后,Guard、Sass和Thor等某些gem可以从命令行自行运行。为了让gem像二进制文件一样可用,我需要在我的gemspec中指定什么。 最佳答案 Gem::Specification.newdo|s|...s.executable='name_of_executable'...endhttp://docs.rubygems.org/read/chapter/20 关于ruby-在Ruby中编写命令行实用程序

  2. ruby - 如果指定键的值在数组中相同,如何合并哈希 - 2

    我有一个这样的哈希数组:[{:foo=>2,:date=>Sat,01Sep2014},{:foo2=>2,:date=>Sat,02Sep2014},{:foo3=>3,:date=>Sat,01Sep2014},{:foo4=>4,:date=>Sat,03Sep2014},{:foo5=>5,:date=>Sat,02Sep2014}]如果:date相同,我想合并哈希值。我对上面数组的期望是:[{:foo=>2,:foo3=>3,:date=>Sat,01Sep2014},{:foo2=>2,:foo5=>5:date=>Sat,02Sep2014},{:foo4=>4,:dat

  3. ruby - 用 Ruby 编写一个简单的网络服务器 - 2

    我想在Ruby中创建一个用于开发目的的极其简单的Web服务器(不,不想使用现成的解决方案)。代码如下:#!/usr/bin/rubyrequire'socket'server=TCPServer.new('127.0.0.1',8080)whileconnection=server.acceptheaders=[]length=0whileline=connection.getsheaders想法是从命令行运行这个脚本,提供另一个脚本,它将在其标准输入上获取请求,并在其标准输出上返回完整的响应。到目前为止一切顺利,但事实证明这真的很脆弱,因为它在第二个请求上中断并出现错误:/usr/b

  4. ruby - 我如何添加二进制数据来遏制 POST - 2

    我正在尝试使用Curbgem执行以下POST以解析云curl-XPOST\-H"X-Parse-Application-Id:PARSE_APP_ID"\-H"X-Parse-REST-API-Key:PARSE_API_KEY"\-H"Content-Type:image/jpeg"\--data-binary'@myPicture.jpg'\https://api.parse.com/1/files/pic.jpg用这个:curl=Curl::Easy.new("https://api.parse.com/1/files/lion.jpg")curl.multipart_form_

  5. Ruby - 如何将消息长度表示为 2 个二进制字节 - 2

    我正在使用Ruby,我正在与一个网络端点通信,该端点在发送消息本身之前需要格式化“header”。header中的第一个字段必须是消息长度,它被定义为网络字节顺序中的2二进制字节消息长度。比如我的消息长度是1024。如何将1024表示为二进制双字节? 最佳答案 Ruby(以及Perl和Python等)中字节整理的标准工具是pack和unpack。ruby的packisinArray.您的长度应该是两个字节长,并且按网络字节顺序排列,这听起来像是n格式说明符的工作:n|Integer|16-bitunsigned,network(bi

  6. java - 为什么 ruby​​ modulo 与 java/other lang 不同? - 2

    我基本上来自Java背景并且努力理解Ruby中的模运算。(5%3)(-5%3)(5%-3)(-5%-3)Java中的上述操作产生,2个-22个-2但在Ruby中,相同的表达式会产生21个-1-2.Ruby在逻辑上有多擅长这个?模块操作在Ruby中是如何实现的?如果将同一个操作定义为一个web服务,两个服务如何匹配逻辑。 最佳答案 在Java中,模运算的结果与被除数的符号相同。在Ruby中,它与除数的符号相同。remainder()在Ruby中与被除数的符号相同。您可能还想引用modulooperation.

  7. ruby-on-rails - 优雅的 Rails : multiple routes, 相同的 Controller Action - 2

    让多条路线去同一条路的最优雅的方式是什么ControllerAction?我有:get'dashboard',to:'dashboard#index'get'dashboard/pending',to:'dashboard#index'get'dashboard/live',to:'dashboard#index'get'dashboard/sold',to:'dashboard#index'这很丑陋。有什么“更优雅”的建议吗?一个类轮的奖励积分。 最佳答案 为什么不只有一个路由和一个Controller操作,并根据传递给它的参数来

  8. ruby-on-rails - 在 RSpec 中,如何以任意顺序期望具有不同参数的多条消息? - 2

    RSpec似乎按顺序匹配方法接收的消息。我不确定如何使以下代码工作:allow(a).toreceive(:f)expect(a).toreceive(:f).with(2)a.f(1)a.f(2)a.f(3)我问的原因是a.f的一些调用是由我的代码的上层控制的,所以我不能对这些方法调用添加期望。 最佳答案 RSpecspy是测试这种情况的一种方式。要监视一个方法,用allowstub,除了方法名称之外没有任何约束,调用该方法,然后expect确切的方法调用。例如:allow(a).toreceive(:f)a.f(2)a.f(1)

  9. ruby - ruby 脚本可以预编译成二进制文件吗? - 2

    我正在开发一个Ruby脚本,需要在没有Ruby解释器的情况下部署到系统上。它将需要在使用ELF格式的FreeBSD系统上运行。我知道有一个ruby​​2exe项目可以编译在Windows上运行的ruby​​脚本,但是在其他操作系统上这样做容易吗?甚至可能吗? 最佳答案 您是否检查过Rubinius或JRuby是否允许您预编译您的代码? 关于ruby-ruby脚本可以预编译成二进制文件吗?,我们在StackOverflow上找到一个类似的问题: https://

  10. ruby-on-rails - 如何为空白字段编写 rspec? [Rails3.1] - 2

    我使用rails3.1+rspec和factorygirl。我对必填字段(validates_presence_of)的验证工作正常。我如何让测试将该事实用作“成功”而不是“失败”规范是:describe"Addanindustrywithnoname"docontext"Unabletocreatearecordwhenthenameisblank"dosubjectdoind=Factory.create(:industry_name_blank)endit{shouldbe_invalid}endend但是我失败了:Failures:1)Addanindustrywithnona

随机推荐