2016-09-02 2 views
1

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

Строка не в 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)) # 

ответ

0

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

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

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

Edit:

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

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

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

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


Преобразование «сентябрь» в 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'); 
+0

это работает, но почему оригинала нет? :) – Jord123

+0

str_replace не работает со смешанными кодировками. Но есть еще способ. Поэтому я собираюсь отредактировать свой ответ и добавить дополнительный метод. – DragonSpirit

+0

Более точно 'str_replace' не * заботится * о кодировках - он работает с байтами. Если совпадают байты, 'str_replace' соответствует. (Если вы забудете о персонажах и подумаете о строках в PHP, как о простом байке, то много чего имеет смысл.) –

Смежные вопросы