У меня есть следующий тестовый код:
setlocale(LC_ALL, 'en_US.UTF8');
function t($text)
{
echo "$text\n";
echo "encoding: ", mb_detect_encoding($text), "\n";
// transliterate
$text = iconv('UTF-8', 'ASCII//TRANSLIT//IGNORE', $text);
echo "iconv: ", $text, "\n";
}
// Latvian alphabet
t('AĀBCČDEĒFGĢHIĪJKĶLĻMNŅOPRSŠTUŪVZŽ aābcčdeēfgģhiījkķlļmnņoprsštuūvzž');
// Greek alphabet
t('ΑαΒβΓγΔδΕεΖζΗηΘθΙιΚκΜμΝνΞξΟοΠπΡρΣσςΤτΥυΦφΧχΨψΩω');
// Cyrillic alphabet + some rarer versions
t('АБВГДЕЖЅЗИІКЛМНОПҀРСТѸФХѠЦЧШЩЪꙐЬѢꙖѤЮѦѪѨѬѮѰѲѴ абвгдеёжзийклмнопрстуфхцчшщъыьэюя');
и его вывод:
AĀBCČDEĒFGĢHIĪJKĶLĻMNŅOPRSŠTUŪVZŽ aābcčdeēfgģhiījkķlļmnņoprsštuūvzž
encoding: UTF-8
iconv: AABCCDEEFGGHIIJKKLLMNNOPRSSTUUVZZ aabccdeefgghiijkkllmnnoprsstuuvzz
ΑαΒβΓγΔδΕεΖζΗηΘθΙιΚκΜμΝνΞξΟοΠπΡρΣσςΤτΥυΦφΧχΨψΩω
encoding: UTF-8
iconv:
АБВГДЕЖЅЗИІКЛМНОПҀРСТѸФХѠЦЧШЩЪꙐЬѢꙖѤЮѦѪѨѬѮѰѲѴ абвгдеёжзийклмнопрстуфхцчшщъыьэюя
encoding: UTF-8
iconv:
это, по сути, игнорирует все греческие и кириллические символы. почему?
Я тестировал в двух средах, где php -i | egrep "iconv (implementation|library)"
выводит либо:
iconv implementation => libiconv
iconv library version => 1.11
или
iconv implementation => libiconv
iconv library version => 1.13
Я также пытался установить внутреннее кодирование ivonv в UTF-8, добавив / удалив функцию setlocale
, но все безрезультатно. iconv, похоже, распознает только символы латинского алфавита и символы латинского алфавита.
ОБНОВЛЕНИЕ : Должна быть проблема с iconv, поскольку команда терминала echo 'ΑαΒβΓγΔδ' | iconv -f utf-8 -t ASCII//TRANSLIT
выдает ошибку iconv: (stdin):1:0: cannot convert
, в то время как echo 'āēī' | iconv -f utf-8 -t ASCII//TRANSLIT
работает и выдает aei
, как и ожидалось.
iconv --version
выводит iconv (GNU libiconv 1.14)
(помимо информации об авторских правах).