2016-09-02 3 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です。ホストがサポートしていないmb_convert_encodingを使用せずに文字列をUTF-8に変換するにはどうすればよいですか?私はまた、LEはBEとiconv('UTF-16', 'UTF-8', $date);を試してみましたが、どちらもエラー出力は、各月のこのような連想配列を構築してみこの

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["Сентября"]; 

編集:

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

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

これは、月はいつもに登場されることを前提としています。あなたがこれを行うことができます例で指定されているよう

日付から月引っ張って同じ順序(曜日の年hh:mm)。また、小文字でイ​​ンデックスを入力することをお勧めします。


'9月'から '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の文字列をバイトの束として考えると、多くのことがもっと意味をなさないでしょう)。 –

関連する問題