PHP UTF-16字符和str_replace

时间:2016-09-02 22:50:08

标签: php encoding utf-8 str-replace multibyte

我想从俄语翻译日期,然后更改其格式。当我使用str_replace('Сентября', 'September', $date);时,它无法正常工作,因为日期函数后来通过抛出包含\xD1\x81\xD0\xB5\xD0\xBD\xD1\x82\xD1\x8F\xD0\xB1\xD1\x80\xD1\x8F

的错误来建议

字符串不是UTF-8,而是UTF-16。如何在不使用我的主机不支持的mb_convert_encoding的情况下将字符串转换为UTF-8?我也尝试了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 个答案:

答案 0 :(得分:0)

尝试为每个月构建一个这样的关联数组。然后你可以使用俄罗斯月份名称作为数组键,它将返回美国等价物。希望这会有所帮助。

$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];

这假设月份将始终以相同的顺序出现(日月hh:mm)。我还建议用小写键入索引。

将'九月'转换为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');