2017-02-06 8 views
0

異なるブラウザではテキストが異なって見えるようにエンコーディングに問題があります。別のブラウザでこの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í ... 

注意、これは完全に健全であるフォントで発生します。

クローム(そのブレーキでも非付加記号文字は、単語garážiを確認することに注意してください):

enter image description here

のFirefox:

enter image description here

クロムに似サファリ(が、問題garážiは発生しません)。

enter image description here

最初の文字は正しく表示されていますが、いくつかの問題があるようです。当社のウェブサイト上のFirefoxで、それはさらに奇妙に見える(https://goout.net/cs/muzea/apple-museum/wucb/):

enter image description here

私の印象では、フォントが実際に文字と発音区別符号に分割されていることです。しかし、どうすればこの問題を解決できますか?アルゴリズムやツールはありますか?私たちはJavaを使用していますので、実装する必要があります。後者のFirefoxのインスタンスに向け

+0

後者のFirefoxインスタンスの方へ:どのようなtext/htmlエディタを使用していますか? [テキストは正規化されずに分解されます](http://www.unicode.org/reports/tr15/#Norm_Forms)。例えば、 'm e 'と' n s k m'の代わりに 'm e s' '' '' '' '' '' '' m ''(隣接アクセントを適切に組み合わせるために隣接するグリフの間にスペースを追加する)ちなみに、この質問はSuperUserに属しています... – JosefZ

+0

も参照してください[テキストの実行はUnicode正規化フォームCではありません](http://stackoverflow.com/q/5465170/3439404)。 _相互運用性を向上させるために、W3CはWeb上でNFC正規化テキストを使用することを推奨します._ – JosefZ

+0

このテキストは、編集者によって別のサイトからコピー貼り付けされました。彼らはちょうど普通の人であり、背後にあるどんな技術も理解していません。編集者が心配する必要がないように、テキスト構造を修復するために何かを実装する必要があります。私はこれを修正するためのJavaコードを実装しているので、スーパーユーザーではなく、ここに投稿しています。私はそれを再標準化することを喜んでしますが、私はちょうど方法を知らない。 –

答えて

1

the text is not normalised but decomposedながら相互運用性を向上させるためには、W3Cは、WebNormalization in HTML and CSSを参照)上のNFC正規化されたテキストを使用することをお勧めします。

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

Cfと:私は次のようnormalizeメソッドを使用することをお勧めしたいのOracleのJava Normalizing Textチュートリアルで

複合体NormSample.java source code,Copyright(c)1995、2008、Oracleおよび/またはその関連会社全著作権所有。 (Apple Museumからコピーペースト D)ワード"Můžete"内の文字を分解例えば


は、誤って代わり

  • "M ů ž e t e"

    • "M u ̊ z ̌ e t e"(8分解文字)としてレンダリングすることができ(6つの事前構成文字)。

    (アクセントを正しく組み合わせるために隣接するグリフの間にスペースが追加されています。)

    残念ながら、私はnormalizeメソッドの例を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> 
    

    そして、ここでは、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を参照してください。