我们遇到了一些编码问题,这些问题会使文本在不同的浏览器中看起来不同。在不同的浏览器中考虑这个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
):
火狐:
Safari(类似于Chrome,但garáži
的问题不会发生):
首先看,文字看起来是正确的,但似乎有一些问题。在我们的网站上使用firefox,它甚至看起来更奇怪(https://goout.net/cs/muzea/apple-museum/wucb/):
我的印象是字体实际上是以字符和变音符号分割的。但我该如何解决这个问题呢?有一些算法或工具吗?我们正在使用Java,因此我们必须在其中实现它。
答案 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>
import unicodedata
unistr = 'Můžete' # copy-pasted from Apple Museum
print ( 'decomposed', unistr)
print ( 'normalized', unicodedata.normalize('NFC', unistr))