Символы PHP UTF-16 и str_replace

Я хотел бы перевести дату с русского языка, а затем изменить ее формат. Когда я использую str_replace('Сентября', 'September', $date);, это не работает, потому что, как позже предлагает функция даты, выдавая ошибку, содержащую \xD1\x81\xD0\xB5\xD0\xBD\xD1\x82\xD1\x8F\xD0\xB1\xD1\x80\xD1\x8F

Строка не в UTF-8, а в UTF-16. Как я могу преобразовать строку в UTF-8 без использования mb_convert_encoding, который не поддерживает мой хост? Пробовал iconv('UTF-16', 'UTF-8', $date); еще и с LE BE, но ни то, ни другое не помогло

Вывод ошибки выглядит так

Uncaught exception 'Exception' with message 'DateTime::__construct(): Failed to parse time string (1 сентября 2016 00:00)

DateTime->__construct('1 \xD1\x81\xD0\xB5\xD0\xBD\xD1\x82\xD1\x8F\xD0\xB1\xD1...', Object(DateTimeZone)) #

person Jord123    schedule 02.09.2016    source источник


Ответы (1)


Попробуйте построить такой ассоциативный массив для каждого месяца. Затем вы можете использовать название месяца в России в качестве ключа массива, и он вернет эквивалент в США. Надеюсь это поможет.

$translator = array("Сентября" => "September");

echo $translator["Сентября"];

Редактировать:

Чтобы вытащить месяц из даты, как указано в примере, вы можете сделать это:

$str = '1 cентября 2016 00:00';
$russian_month = explode(' ', strtolower($str))[1];

$translator = array("cентября" => "September");
echo $translator[$russian_month];

Это предполагает, что месяц всегда будет отображаться в одном и том же порядке (день месяц год чч:мм). Я также рекомендую вводить индексы строчными буквами.


Преобразование «сентябрь» в UTF-16, а затем замена, кажется, работает. Итак, вот еще один способ сделать это.

function translateDate($from, $to, $str){
     $from = iconv('UTF-8','UTF-16BE', $from);
     $to = iconv ( 'UTF-8', 'UTF-16BE' ,  $to );
     $str = iconv ( 'UTF-8', 'UTF-16BE' , $str);

     $new = str_ireplace($from, $to,  $str);
     return iconv (  'UTF-16BE', 'UTF-8',  $new);
}

echo translateDate('сентября', 'September', '1 сентября 2016 00:00');
person DragonSpirit    schedule 03.09.2016
comment
str_replace не работает со смешанными кодировками. Но есть еще способ. Поэтому я собираюсь отредактировать свой ответ и добавить дополнительный метод. - person DragonSpirit; 03.09.2016
comment
Точнее, str_replace не заботится о кодировках — он работает с байтами. Если байты совпадают, str_replace соответствует. (Если вы забудете о символах и будете думать о строках в PHP как о наборе байтов, многие вещи приобретут гораздо больший смысл.) - person user3942918; 03.09.2016