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

Unicode 所有浏览器中的奇怪字体编码,unicode,encoding,utf-8,Unicode,Encoding,Utf 8,我们有一些编码问题,这使得文本在不同的浏览器中看起来不同。在不同浏览器中考虑这个jsFoDels: 文本的正确外观应如下所示: 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 d

我们有一些编码问题,这使得文本在不同的浏览器中看起来不同。在不同浏览器中考虑这个jsFoDels:

文本的正确外观应如下所示:

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:

火狐:

Safari与Chrome类似,但garáži没有出现问题:

乍一看,文本看起来是正确的,但似乎有一些问题。我们网站上的firefox看起来更奇怪:


我的印象是,这种字体实际上分为字符和变音符号。但是我怎么才能解决这个问题呢?有什么算法或工具吗?我们正在使用Java,因此我们必须在其中实现它。

对于后一个Firefox实例:为了提高互操作性,W3C建议在Web上使用NFC标准化文本,请参见

根据Oracle Java教程,我建议使用以下规范化方法:

参见a complex,版权c 1995年、2008年,Oracle和/或其附属公司。版权所有

例如,粘贴的单词Můžete copy中的分解字符可能会被错误地呈现为

může t e 8个分解字符,而不是 Může t e 6个预合成字符。 请注意,在相邻glyph之间添加了空格,以便正确渲染组合重音

不幸的是,我不能给出Java中规范化方法的示例;相反,下面是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> 
以下是:


另请参见。

关于后一个Firefox实例:您使用的是什么文本/html编辑器?这个例如,Měšťa n s k ém而不是měťa n s kém在相邻字形之间添加了空格,以正确地呈现组合重音。顺便说一句,这个问题属于超级用户…另请参阅。为了提高互操作性,W3C建议在Web上使用NFC规范化文本。这些文本只是由我们的编辑从另一个站点复制粘贴的。他们只是普通人,不了解背后的任何技术细节。我需要实现一些东西来修复文本结构,这样我们的编辑就不用担心了。我将把它发布在这里,而不是超级用户上,因为我将实现一个Java代码来解决这个问题。我很乐意对其进行重新规范化,但我不知道如何进行。Oracle Java教程?我猜您使用的web字体不包含文本中某些字符的字形。浏览器随后将替换另一种字体的字形。这就解释了不同外观标志符号的混合。
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> 
import unicodedata

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