кодировка — символы PHP UTF-16 и str_replace

Я хотел бы перевести дату с русского языка, а затем изменить ее формат. Когда я использую str_replace('Сентября', 'September', $date); это не работает, потому что, как позже предлагает функция 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)) #

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');
0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]