Преобразование кодировки из cp1255 в UTF-8

У меня есть следующие закодированные строки на иврите в старой БД:

éçìéó àú ùîåàì æåñîï äòåáã á÷áåöä îòì 50 ùðä

Код ASP, используемый для декодирования этой строки, выглядит следующим образом:

function Get_RightHebrew(ByVal sText)
    Dim i
    Dim sRightText

    if isNull(sText) then
        sRightText = ""
    else
        For i = 1 To Len(sText)
            If (AscW(Mid(sText, i, 1)) >= 1488 And AscW(Mid(sText, i, 1)) <= 1514) Then
                sRightText = sRightText & Chr(AscW(Mid(sText, i, 1)) - 1264)
            else
                sRightText = sRightText & Mid(sText, i, 1)
            End If
        Next
    end if

    Get_RightHebrew = sRightText

End Function

Я ищу эквивалентную функцию PHP для преобразования строки в правильный UTF-8.


person lior r    schedule 23.05.2017    source источник
comment
Я не могу преобразовать ваш код из ASP в PHP, но вы можете использовать функцию PHP mb_convert_encoding(). Вам нужно сохранить файл PHP как UTF-8 без спецификации.   -  person Koray Küpe    schedule 23.05.2017
comment
BOM в любом случае лишний с UTF-8, он используется для текстовых редакторов, чтобы намекнуть на кодировку Unicode.   -  person Code4R7    schedule 23.05.2017
comment
@KorayKüpe CP1255 не поддерживается: php.net/manual/en/mbstring.supported -encodings.php   -  person Alex Blex    schedule 23.05.2017
comment
@Code4R7 Тогда попробуйте iconv(utf-8, cp1255, $value);   -  person Koray Küpe    schedule 23.05.2017
comment
@Koray Küpe, вы имеете в виду Alex Blex ;) Поскольку ICU является факто-де-стандартом от Консорциума Unicode, я бы пропустил все остальные функции транскодирования. Хотя iconv пригодится для транслитерации.   -  person Code4R7    schedule 23.05.2017
comment
@ Code4R7 Извините за неправильное упоминание. :)   -  person Koray Küpe    schedule 23.05.2017
comment
iconv(): обнаружен недопустимый символ во входной строке   -  person lior r    schedule 23.05.2017
comment
@liorr, это строка, которая есть у вас в базе данных, или строка, которую вы видите в своем клиенте базы данных? Для меня это не похоже на иврит. Не могли бы вы обновить вопрос с результатом bin2hex для строки, полученной из базы данных. Важно получить значение с драйвером php db и передать его функции напрямую, а не просто скопировать и вставить строку, чтобы избежать неправильного перекодирования.   -  person Alex Blex    schedule 24.05.2017
comment
Проверьте ответ Кул-Тигина, это помогло   -  person lior r    schedule 25.05.2017


Ответы (1)


У вас есть строка, закодированная CP1255, но декодированная с помощью CP1252 (Latin1), поэтому вы можете получить свой текст на иврите с помощью обмана.

# mis-decoded string
$str = "éçìéó àú ùîåàì æåñîï äòåáã á÷áåöä îòì 50 ùðä";

# convert to CP1252 from UTF-8
$str = iconv("UTF-8", "CP1252", $str);

# convert to UTF-8 by claiming $str is encoded with CP1255
$str = iconv("CP1255", "UTF-8", $str);

echo $str;

Вот тест, который я сделал онлайн: https://3v4l.org/7taaN

Я хотел бы поделиться примером кода, который использует функции mb_* вместо iconv, но CP1255 не поддерживается. Использование набора символов ISO-8859-8 с mb_* вместо этого является вариантом, но, поскольку это подмножество CP1255, вероятно, произойдет потеря данных.

person Kul-Tigin    schedule 24.05.2017
comment
Хорошо поймал! Как вы узнали, что это был декодированный cp1252? Мне также любопытно, почему вы предпочитаете функции mb_* / iconv_*? - person Code4R7; 24.05.2017
comment
@ Code4R7 На самом деле из опыта. Это распространенная ошибка в ASP. Когда вы не указываете CodePage, по умолчанию часто используется CP1252, но тег <meta charset.. затеняет факты на стороне клиента, и происходит волшебство: все работает, но хранится неправильно. Я не разработчик PHP, но я предпочитаю mb_*, если у меня есть выбор из-за этого - person Kul-Tigin; 24.05.2017
comment
Спасибо, что поделились, теперь я понимаю, почему вы предпочитаете mb_* функции iconv. Лично мне больше нравится Intl, тогда вам не нужно настраивать/перезаписывать кодировку ввода/вывода/исхода перед использованием. И в конце концов, когда используется Unicode, приложение/сайт, вероятно, будет международным, как и остальная часть сети, а Intl предлагает всевозможные дополнительные функции, такие как IntlCalendar. - person Code4R7; 24.05.2017
comment
@ Code4R7 Это очень многообещающе, но не хватает хорошей документации. Буду иметь в виду, спасибо. - person Kul-Tigin; 24.05.2017
comment
Большая часть документации находится по адресу userguide.icu-project.org . Отсутствие хорошей документации — это действительно проблема, это случается всегда, когда начинается настоящее веселье с PHP. Когда становится тяжело, крутые идут вперед. - person Code4R7; 24.05.2017
comment
ТЫ ГЕНИЙ! - person lior r; 25.05.2017