所有浏览器中的奇怪字体编码

时间:2017-02-06 20:10:55

标签: unicode encoding utf-8

我们遇到了一些编码问题,这些问题会使文本在不同的浏览器中看起来不同。在不同的浏览器中考虑这个jsfiddle:

https://jsfiddle.net/w3297yLt/

文字看起来应该是这样的:

Apple Museum je první muzeum svého druhu v České republice, 
které bylo nedávno otevřeno v Husově ulici v centru Prahy. 
Můžete zde nahlédnout do nedávné minulosti a vžít se do doby, 
kdy Steve Jobs sestrojil spolu se Stevem Wozniakem v garáži 
svých rodičů první osobní ...

请注意,这不是字体问题,对于完全合理的字体会发生这种情况。

Chrome(请注意,即使是非变音字符,也请检查单词garáži):

enter image description here

火狐:

enter image description here

Safari(类似于Chrome,但garáži的问题不会发生):

enter image description here

首先看,文字看起来是正确的,但似乎有一些问题。在我们的网站上使用firefox,它甚至看起来更奇怪(https://goout.net/cs/muzea/apple-museum/wucb/):

enter image description here

我的印象是字体实际上是以字符和变音符号分割的。但我该如何解决这个问题呢?有一些算法或工具吗?我们正在使用Java,因此我们必须在其中实现它。

1 个答案:

答案 0 :(得分:1)

对于后一个Firefox实例:the text is not normalised but decomposed为了提高互操作性,W3C建议在Web上使用NFC规范化文本(参见Normalization in HTML and CSS)。

通过Oracle Java Normalizing Text教程,我建议使用以下normalize方法:

normalized_string = Normalizer.normalize(target_chars, Normalizer.Form.NFC);

比照。复杂的NormSample.java source code版权所有(c)1995,2008,Oracle和/或其附属公司。保留所有权利。

例如,单词"Můžete"中的分解字符(复制粘贴 d来自Apple Museum)可能被错误地呈现为

  • "M u ̊ z ̌ e t e"(8个已分解的字符)而不是
  • "M ů ž e t e"(6个预先组成的字符)。

(注意在相邻的字形之间添加空格以正确地渲染组合重音。)

不幸的是,我不能在 Java 中给出normalize方法的示例;相反,这是 PowerShell 的相似的.Normalize方法示例:

PS D:\PShell> 'Může' | Get-CharInfo | Format-Table -AutoSize -Wrap

Char CodePoint        Category Description           
---- ---------        -------- -----------           
   M U+004D    UppercaseLetter Latin Capital Letter M
   u U+0075    LowercaseLetter Latin Small Letter U  
   ̊  U+030A     NonSpacingMark Combining Ring Above  
   z U+007A    LowercaseLetter Latin Small Letter Z  
   ̌  U+030C     NonSpacingMark Combining Caron       
   e U+0065    LowercaseLetter Latin Small Letter E  

PS D:\PShell> 'Může'.Normalize('FormC') | Get-CharInfo | Format-Table -AutoSize -Wrap

Char CodePoint        Category Description                         
---- ---------        -------- -----------                         
   M U+004D    UppercaseLetter Latin Capital Letter M              
   ů U+016F    LowercaseLetter Latin Small Letter U With Ring Above
   ž U+017E    LowercaseLetter Latin Small Letter Z With Caron     
   e U+0065    LowercaseLetter Latin Small Letter E                

PS D:\PShell> 

这里是Python's normalize method

import unicodedata

unistr = 'Můžete'               # copy-pasted from Apple Museum
print ( 'decomposed', unistr)
print ( 'normalized', unicodedata.normalize('NFC', unistr))

另见this jsfiddle