PHP-інструменти для японської мови

Пропрацювавши рік в Японській компанії системним інженером, я виділив декілька моментів, на які обов'язково має знати програміст, який працює з японським текстом.

В Японській мові 3 алфавіту, що робить роботу з текстом не такий простий, як в європейських мовах. Почнемо з самого простого і перейдемо до більш складного.

Як і в Росії, в Японії залишилися сайти з однобайтовим кодуванням, перекладаємо текст в UTF-8:

$output = iconv('Shift-JIS', 'UTF-8//IGNORE', $input);

Є така особливість у японців: текст може бути записаний двома способами — так звана «повна довжина» (Zen-Kaku) і «половина довжини» (Han-Kaku). Японський текст — це Zen-Kaku, європейський текст — це Han-Kaku, але в принципі будь-європейський текст може бути записаний як Zen-Kaku. Приклад: SALE. Але особливо японці люблять зен-каку цифри: 123.

Щоб перевести SALE у SALE:

public function toHanKaku($text)
{
return mb_convert_kana($text, 'a');
}

Навіщо ж японцям 3 алфавіту? У першому кандзі (漢字) — записуються ієрогліфи. Другий — це хірагана (ひらがな), це, можна сказати, головний алфавіт, тому що будь-кандзі може бути записаний хіраганою. І третій — це катакана (カタカナ) і вона — це те ж саме, що і хірагана, за винятком того, що нею записуються іноземні слова.

Для перекладу хірагани в катакану (はずれ в ハズレ) (одне і те ж слово в різних алфавітах) скористаємося тією ж функцією, тільки з іншим ключем:

public function toKatakana($text)
{
return mb_convert_kana($text, 'C');
}

Та ж сама проблема і з регулярними виразами. Є дата у форматі: 2016.20.20. Щоб вона розпізнавалася, обов'язкова умова модифікатор «u» — Unicode.

preg_match('/[\d]{4}.[\d]{2}.[\d]{2}/u', $text, $match);

Як і всі, японці не заморочуються з адреси сторінок і пишуть прям на адресу японськими ієрогліфами, наприклад, так:

<a href="http://ja.wikipedia.org/wiki/ヤフー">ヤフー</a> 

Адреса вірна, але, щоб його розумів, наприклад, Curl, він повинен бути закодований:

public function japaneseUrlEncode($text) 
{
return preg_replace_callback(
'/[^\x21-\x7e]+/', function($matches) {
return urlencode($matches[0]);
}, $text
);
}

Система вводу японського тексту теж особлива, вона дозволяє прямо з клавіатури без додаткових інструментів додавати різні прикраси: ♪♫☆★""︎♡. Всіма цими штуками буквально переповнені блоги, форуми, твіттери і тому подібні місця.

Проблема ж полягає в тому, що при спробі вставити деякі emoji в звичайну таблицю utf8_general_ci, ми отримаємо обрізаний текст і помилку:

Warning: #1366 Incorrect string value: '\xF0\x9F\x98\x8ASI...' column for 'content' at row 1

А справа тут у тому що utf8_general_ci — це звичайно дуже багатий набір символів, але він обмежений 3 байтами на символ і не містить 4-байтові емодзі. Кодування яка підійде — це utf8mb4.

Приклад текстової краси по-японськи:
みなさまこんにちは★SIENAなんばパークス店です♡
本日は入荷したてのnewピアスのご紹介です♫


Але не всім підійде змінювати кодування, є інше рішення — видаляємо 4-байтові емодзі:

public function clear4byte($string)
{
return preg_replace('%(?:
\xF0[\x90-\xBF][\x80-\xBF]{2} |
[\xF1-\xF3][\x80-\xBF]{3} |
\xF4[\x80-\x8F][\x80-\xBF]{2}
)%xs', ", $string); 
}

Сподіваюся, цей матеріал буде корисний тим, хто працює з японським текстом, а також всім іншим для загального розвитку.

P. S.: Перша публікація не вдалася, коментар модератора:
Відчуття, що стаття обривається десь посередині. Доповніть матеріал і опублікуйте ще раз.
Те, що називається «дежавю» — з хабром стався якраз випадок, описаний в останньому прикладі, а саме: я додав для наочності символи в четырехбайтовой кодуванні, що викликало помилку, і текст був збережений в базу даних в обрізаному вигляді.
Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.