草庐IT

php - 在 PHP 中根据 W3C 规范化 Unicode

coder 2024-04-14 原文

W3C validator 中验证我网站的 HTML 代码时我收到以下警告:

Line 157, Column 220: Text run is not in Unicode Normalization Form C.

…i͈̭̋ͥ̂̿̄̋̆ͣv̜̺̋̽͛̉͐̀͌̚e͖̼̱ͣ̓ͫ͆̍̄̍͘-̩̬̰̮̯͇̯͆̌ͨ́͌ṁ̸͖̹͎̱̙̱͟͡i̷̡͌͂͏̘̭̥̯̟n̏͐͌̑̄̃͘͞…

我正在用 PHP 5.3.x 开发它,所以我可以使用 Normalizer类。

因此,为了解决这个问题,我应该在显示用户所做的任何输入(例如评论)时使用 Normalizer::normalize($output) 还是应该使用 Normalizer::normalize($input) 在将任何用户输入存储到数据库之前?

tl;dr:我应该使用 Unicode normalization 吗?在将用户输入存储到数据库之前还是在显示时?

最佳答案

根据您的应用程序的目的和性质,您可以决定是在读取用户输入时应用规范化,还是将其存储到数据库中,或者在编写时应用规范化,或者根本不应用规范化。总结问题评论中提到的长线程,也可在 http://validator.w3.org/feedback.html 的官方列表存档中找到。

  • 警告消息来自实验性“HTML5 验证”(这实际上是一个 linter,除了一些正式测试外还应用主观规则)。
  • 该消息并非基于 HTML5 草案中的任何要求,而是基于对某些软件中可能导致问题的原因的意见。
  • 意见最初使“HTML5 验证”发出错误消息,现在发出警告。

虽然不常见,但确实有可能将非规范化数据作为用户输入。这不取决于浏览器执行的规范化(它们不会做这样的事情,尽管可以想象它们将来可能会做),而是取决于输入方法和习惯。例如,键入字母 ü(u 元音变音,或带有分音符的 u)的方法倾向于以规范化的预组合形式生成字符。人们可以将其生成为非规范化的分解形式,如字母 u 后跟组合分音符,但他们通常没有理由这样做,而且大多数人甚至不知道如何去做。

如果您在软件中进行字符串比较,它们可能会也可能不会(取决于使用的比较例程)处理例如预组合的 ü 等于分解后的演示文稿。简单的实现将它们视为不同的,因为它们在简单字符级别(Unicode 代码点)上绝对不同。

在某些时候(最迟在写作阶段)进行规范化的一个原因是,预组合字符通常会更可靠地显示。要呈现规范化的 ü,程序只需从字体中选取一个字形即可。要呈现分解后的 ü,程序必须要么将其识别为规范化的 ü 的规范等价物,要么将字母 u 正确放置在其上方,并适当注意 u 字形的图形属性,许多程序都失败了在此。

另一方面,在收到非规范化数据作为用户输入的极少数情况下,用户很可能有理由生成它。他可能认为规范化的 ü 和非规范化的 ü 是不同的,需要同样对待。

关于php - 在 PHP 中根据 W3C 规范化 Unicode,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8766675/

有关php - 在 PHP 中根据 W3C 规范化 Unicode的更多相关文章

  1. ruby-on-rails - unicode 字符串的长度 - 2

    在我的Rails(2.3,Ruby1.8.7)应用程序中,我需要将字符串截断到一定长度。该字符串是unicode,在控制台中运行测试时,例如'א'.length,我意识到返回了双倍长度。我想要一个与编码无关的长度,以便对unicode字符串或latin1编码字符串进行相同的截断。我已经了解了Ruby的大部分unicode资料,但仍然有些一头雾水。应该如何解决这个问题? 最佳答案 Rails有一个返回多字节字符的mb_chars方法。试试unicode_string.mb_chars.slice(0,50)

  2. ruby - 如何根据特征实现 FactoryGirl 的条件行为 - 2

    我有一个用户工厂。我希望默认情况下确认用户。但是鉴于unconfirmed特征,我不希望它们被确认。虽然我有一个基于实现细节而不是抽象的工作实现,但我想知道如何正确地做到这一点。factory:userdoafter(:create)do|user,evaluator|#unwantedimplementationdetailshereunlessFactoryGirl.factories[:user].defined_traits.map(&:name).include?(:unconfirmed)user.confirm!endendtrait:unconfirmeddoenden

  3. ruby - 如何使用 Selenium Webdriver 根据 div 的内容执行操作? - 2

    我有一个使用SeleniumWebdriver和Nokogiri的Ruby应用程序。我想选择一个类,然后对于那个类对应的每个div,我想根据div的内容执行一个Action。例如,我正在解析以下页面:https://www.google.com/webhp?sourceid=chrome-instant&ion=1&espv=2&ie=UTF-8#q=puppies这是一个搜索结果页面,我正在寻找描述中包含“Adoption”一词的第一个结果。因此机器人应该寻找带有className:"result"的div,对于每个检查它的.descriptiondiv是否包含单词“adoption

  4. ruby - 如何根据长度将路径数组转换为嵌套数组或散列 - 2

    我需要根据字符串路径的长度将字符串路径数组转换为符号、哈希和数组的数组给定以下数组:array=["info","services","about/company","about/history/part1","about/history/part2"]我想生成以下输出,对不同级别进行分组,根据级别的结构混合使用符号和对象。产生以下输出:[:info,:services,about:[:company,history:[:part1,:part2]]]#altsyntax[:info,:services,{:about=>[:company,{:history=>[:part1,:pa

  5. ruby - gem 规范失败 - 2

    我正在为毕业设计开发GEM,TravisCI构建不断失败。这是我在Travis上的链接:https://travis-ci.org/ricardobond/perpetuus/builds/8709218构建错误是:$bundleexecrakerakeaborted!Don'tknowhowtobuildtask'default'/home/travis/.rvm/gems/ruby-1.9.3-p448/bin/ruby_noexec_wrapper:14:in`eval'/home/travis/.rvm/gems/ruby-1.9.3-p448/bin/ruby_noexec_

  6. ruby - 在 Ruby 中将转义的 unicode (\u008E) 转换为重音字符 (Ž)? - 2

    我遇到了一个非常困难的时期:#containedwithin:"MA\u008EEIKIAI"#shouldbe"MAŽEIKIAI"#natureofstring$pstring3"MA\u008EEIKIAI"$putsstring3MAEIKIAI$string3.inspect"\"MA\\u008EEIKIAI\""$string3.bytes#关于从哪里开始的任何想法?注意:这不是我的previousquestion的副本. 最佳答案 \u008E表示代码点为8e(十六进制)的unicode字符出现在字符串中的那个位置。

  7. ruby - 尝试比较两个文本文件,并根据信息创建第三个 - 2

    我有两个文本文件,master.txt和926.txt。如果926.txt中有一行不在master.txt中,我想写入一个新文件notinbook.txt。我写了我能想到的最好的东西,但考虑到我是一个糟糕的/新手程序员,它失败了。这是我的东西g=File.new("notinbook.txt","w")File.open("926.txt","r")do|f|while(line=f.gets)x=line.chompifFile.open("master.txt","w")do|h|endwhile(line=h.gets)ifline.chomp!=xputslineendende

  8. ruby - 如何替换 Ruby 1.9 上的 Unicode gem? - 2

    不幸的是,Unicode0.1(sudogeminstallunicode)不能在Ruby1.9上运行。我有以下片段:require"rubygems"require"unicode"str="áéíóúç"Unicode.normalize_KD(str).gsub(/[^\x00-\x7F]/n,"")#=>aeiouc我用它来将标题转换为永久链接,而不删除重音字符。有没有办法使用pack或unpack方法转换此类文本? 最佳答案 更新:更好的选择可能是使用gemunicode_utils这是专门为这些缺失的功能创建的:requ

  9. ruby - 根据值然后键对ruby中的哈希进行排序 - 2

    如何在ruby​​中先根据值然后根据键对散列进行排序?例如h={4=>5,2=>5,7=>1}将排序为[[7,1],[2,5],[4,5]]我可以根据值进行排序h.sort{|x,y|x[1]y[1]}但我不知道如何根据值进行排序,然后在值相同时键入 最佳答案 h.sort_by{|k,v|[v,k]}这使用了Array的事实混入Comparable并定义逐元素。注意上面等价于h.sort_by{|el|el.reverse}相当于h.sort_by(&:reverse)这可能会或可能不会更具可读性。如果你知道Hashes一般都是先

  10. ruby-on-rails - Ruby 将 IDN 域从 Punycode 转换为 Unicode - 2

    我正在编写一个Rails应用程序,它需要将IDN域名从Punycode转换为它的Unicode等效项。我尝试安装idngem绑定(bind)到GNULibIDN,但它不会编译native代码。显然others与Ruby1.9.x有同样的问题。我也试过纯RubySimpleIDNgem,但我更喜欢本地的东西。 最佳答案 试试simpleidngem.它适用于Ruby1.8.7和1.9.2。编辑你的Gemfile:gem'simpleidn'然后可以输入如下命令:SimpleIDN.to_unicode("xn--mllerriis-l

随机推荐