2017-02-06 17 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í ... 

Обратите внимание, что это не проблема шрифта, это происходит со шрифтами, которые полностью звук.

Chrome (обратите внимание, что он тормозит даже без диакритические знаки символов, проверка слов garáži):

enter image description here

Firefox:

enter image description here

Safari (аналог Chrome, но проблема с garáži не происходит):

enter image description here

При первом взгляде текст выглядит правильно, но, похоже, с ним возникают некоторые проблемы. С светлячок на нашем сайте он выглядит даже более странно (https://goout.net/cs/muzea/apple-museum/wucb/):

enter image description here

У меня сложилось впечатление, что шрифт фактически разделен на символы и диакритические знаки. Но как я могу это исправить? Есть ли какой-нибудь алгоритм или инструмент? Мы используем Java, поэтому нам придется реализовать его в нем.

+0

К последнему экземпляру Firefox: какой текст/html-редактор вы используете? [Текст не нормализуется, но разлагается] (http://www.unicode.org/reports/tr15/#Norm_Forms). Например, 'm e ̌ s ̌ t ̌ a n s k e m' вместо' m ě š ť a n s k é m' (добавленные промежутки между соседними глифами для правильного совмещения акцентов). BTW, этот вопрос относится скорее к SuperUser ... – JosefZ

+0

См. Также [Текстовый прогон не в форме нормализации Unicode C] (http://stackoverflow.com/q/5465170/3439404). _ Чтобы улучшить взаимодействие, W3C рекомендует использовать нормализованный текст NFC в Интернете. – JosefZ

+0

Этот текст был только что скопирован с другого сайта нашими редакторами. Они просто обычные люди и не понимают никаких технических проблем. Мне нужно что-то реализовать, чтобы восстановить текстовую структуру, чтобы нашим редакторам не пришлось беспокоиться. Я размещаю его здесь, а не на суперпользователе, поскольку я буду внедрять Java-код, чтобы исправить это. Я буду рад перенормировать его, но я просто не знаю, как это сделать. –

ответ

1

К последнему примеру Firefox: the text is not normalised but decomposed в то время как для улучшения совместимости, W3C рекомендует использовать NFC нормализованного текста на Web (см Normalization in HTML and CSS).

По Oracle Java Normalizing Text учебник, я бы посоветовал использовать следующий метод: normalize

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

Cf. комплекс NormSample.java source code, Авторское право (c) 1995, 2008, Oracle и/или его филиалы. Все права защищены.


Например, разлагаемые символов в слове "Můžete" (копировать-вставить д из Apple Museum) может быть ошибочно визуализируется как

  • "M u ̊ z ̌ e t e" (8 разлагаются символов) вместо
  • "M ů ž e t e" (6 предварительно помеченных символов).

(Отметьте добавленные промежутки между соседними глифами для правильного совмещения акцентов.)

К сожалению, я не могу привести пример метода normalize в Java; вместо этого, вот PowerShell «s конгениальный пример .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.