ホームページ バックエンド開発 PHPの問題 PHP UTF8をUnicodeに変換する方法

PHP UTF8をUnicodeに変換する方法

Jul 18, 2020 am 09:29 AM
unicode utf8

php utf8 を Unicode に変換する方法: 最初に PHP サンプル ファイルを作成し、次に「utf8_str_to_unicode」メソッドを定義し、次に ord 関数と dechex 関数を使用して変換関数を実装し、最後にファイルを実行します。

PHP UTF8をUnicodeに変換する方法

#PHP は Unicode と Utf-8 エンコーディング間の相互変換を実現します

Unicode エンコーディングの変換は、最近使っていたので、PHPのライブラリ関数を調べてみたのですが、Unicode文字列をエンコード・デコードできる関数が見つかりませんでした!まあ、それが見つからない場合は、自分で実装してください。 。 。

Unicode と Utf-8 エンコードの違い

Unicode は文字セットであり、UTF-8 は Unicode の 1 つであり、Unicode は固定長です。 、UTF-8 は可変ですが、漢字の場合、Unicode は UTF-8 よりも 1 バイト少ない値を占めます。 Unicode は 2 バイトですが、UTF-8 の中国語文字は 3 バイトを占めます。

UTF-8 でエンコードされた文字は、理論的には最大 6 バイトの長さにすることができますが、16 ビット BMP (Basic Multilingual Plane) 文字の長さは最大 3 バイトのみです。 UTF-8 エンコーディング テーブルを見てみましょう:

U-00000000 - U-0000007F: 0xxxxxxx 
U-00000080 - U-000007FF: 110xxxxx 10xxxxxx 
U-00000800 - U-0000FFFF: 1110xxxx 10xxxxxx 10xxxxxx 
U-00010000 - U-001FFFFF: 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx 
U-00200000 - U-03FFFFFF: 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 
U-04000000 - U-7FFFFFFF: 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
ログイン後にコピー

xxx の位置は、文字エンコーディング番号のバイナリ表現によって埋められます。右にある x にはそれほど特別な意味はなく、文字エンコード番号のマルチバイト文字列。マルチバイト文字列では、最初のバイトの先頭にある「1」の数が文字列全体のバイト数になることに注意してください。最初の行は ASCII エンコードと互換性があるように 0 で始まり、1 バイト、2 行目は 2 バイト文字列、3 行目は中国語などの 3 バイトです。 (個人的には、実際には、先頭にある 1 の数を単純にバイト数と見なすことができます)

Unicode を Utf-8 に変換する方法

Unicode を UTF-8 に変換するには、もちろん違いが何であるかを知る必要があります。 Unicode のエンコーディングがどのように UTF-8 に変換されるかを見てみましょう。UTF-8 では、文字のバイトが 0x80 (128) 未満の場合、それは 1 バイトを占める ASCII 文字であり、 UTF-8 は ASCII エンコードと互換性があるため、変換する必要があります。 Unicode の漢字「君」のエンコードが「u4F60」の場合、100111101100000 にバイナリ変換し、UTF-8 方式で変換します。 Unicode バイナリから 2 進数を下位から上位まで、一度に 6 桁ずつ取り出すことができます。たとえば、上記の 2 進数を次の形式に取り出すことができます。以前のものは形式に従って埋められ、任意の8 ビット未満は 0 で埋められます。

unicode: 100111101100000                   4F60
utf-8:    11100100,10111101,10100000       E4BDA0
ログイン後にコピー

上記から、Unicode と UTF-8 の間の変換が直感的にわかります。もちろん、UTF-8 の形式を知った後は、その逆の操作、つまりバイナリで変換することもできます。対応する位置からそれを取り出し、結果の Unicode 文字に変換します (この操作は「置換」によって完了できます)。例えば、上記の「you」の変換では、その値が0x800より大きく0x10000未満であるため、3バイト格納と判断できるため、最上位ビットを「12」ビット右にシフトする必要があります。そして、3 バイト形式に従って、最高値を取得するには、最上位ビットは 11100000 (0xE0 ) または (|) になります。同様に2桁目を右に「6」ビットシフトし、最上位桁と2桁目のバイナリ値を残し、111111(0x3F)と位置(&)演算を行うことで計算できます。 ) を計算し、11000000 (0x80) または (|) で合計します。 3 番目のビットをシフトする必要はなく、最後の 6 ビットを直接取得し (& と 111111 (ox3F))、その後 11000000 (0x80) と OR (|) を演算します。

Utf-8 を Unicode に戻す方法

もちろん、UTF-8 から Unicode への変換もシフトなどによって行われます。 UTF-8 に変換 フォーマット内の対応する位置の 2 進数を抽出します。上の例では、「you」は 3 バイトであるため、上位ビットから下位ビットまで各バイトを処理する必要があります。

UTF-8 では、「あなた」は 11100100,10111101,10100000 です。上位ビット、つまり最初のバイト 11100100 から「0100」を取り出します。これは非常に簡単です。11111 (0x1F) と AND (&) を取るだけです。3 バイトから、毎回 6 桁が取得されるため、最上位は 12 ビット目より前でなければなりません。

したがって、結果は 12 ビット左にシフトする必要があり、最上位ビットは 0100,000000,000000 になります。 2 番目のビットは「111101」を取り出すため、2 番目のバイト 10111101 と 111111 (0x3F) を AND (&) するだけで済みます。結果を 6 ビット左にシフトし、最上位バイトまたは (|) の結果を取得すると、2 番目のビットが完成し、結果は 0100,111101,000000 になります。

同様に、最後の桁は 111111 (0x3F) と直接 AND (&) 演算され、次に前の結果と OR (|) 演算されて、結果 0100,111101,100000 が得られます。

PHP コードの実装

/**
 * utf8字符转换成Unicode字符
 * @param  [type] $utf8_str Utf-8字符
 * @return [type]           Unicode字符
 */
function utf8_str_to_unicode($utf8_str) {
    $unicode = 0;
    $unicode = (ord($utf8_str[0]) & 0x1F) << 12;
    $unicode |= (ord($utf8_str[1]) & 0x3F) << 6;
    $unicode |= (ord($utf8_str[2]) & 0x3F);
    return dechex($unicode);
}
/**
 * Unicode字符转换成utf8字符
 * @param  [type] $unicode_str Unicode字符
 * @return [type]              Utf-8字符
 */
function unicode_to_utf8($unicode_str) {
    $utf8_str = &#39;&#39;;
    $code = intval(hexdec($unicode_str));
    //这里注意转换出来的code一定得是整形,这样才会正确的按位操作
    $ord_1 = decbin(0xe0 | ($code >> 12));
    $ord_2 = decbin(0x80 | (($code >> 6) & 0x3f));
    $ord_3 = decbin(0x80 | ($code & 0x3f));
    $utf8_str = chr(bindec($ord_1)) . chr(bindec($ord_2)) . chr(bindec($ord_3));
    return $utf8_str;
}
ログイン後にコピー

テストしました

$utf8_str = &#39;我&#39;;
//这是汉字“你”的Unicode编码
$unicode_str = &#39;4f6b&#39;;
//输出 6211
echo utf8_str_to_unicode($utf8_str) . "<br/>";
//输出汉字“你”
echo unicode_str_to_utf8($unicode_str);
ログイン後にコピー

上記の変換は、中国語の文字 (通常は非 ASCII) のテスト用です。同じことの繰り返しなので、それほど労力を費やす必要はありません。

また、これら 2 つの関数は単純に実装されており、単一文字 (完全な utf8 文字または完全な Unicode 文字) の変換のみをサポートしています。 。 。

推奨: 「

PHP チュートリアル

以上がPHP UTF8をUnicodeに変換する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

utf8 でエンコードされた中国語の文字は何バイトを占めますか? utf8 でエンコードされた中国語の文字は何バイトを占めますか? Feb 21, 2023 am 11:40 AM

UTF8 でエンコードされた中国語文字は 3 バイトを占めます。 UTF-8 エンコードでは、1 つの中国語文字は 3 バイトに相当し、1 つの中国語の句読点は 3 バイトを占めますが、Unicode エンコードでは、1 つの中国語文字 (繁体字中国語を含む) は 2 バイトに相当します。 UTF-8 は各文字のエンコードに 1 ~ 4 バイトを使用します。1 つの US-ASCIl 文字のエンコードには 1 バイトのみが必要です。ラテン語、ギリシャ語、キリル文字、アルメニア語、および発音区別符号付きのヘブライ語。アラビア語、シリア語およびその他の文字は 2 バイトが必要です。エンコーディング。

PHPを深く理解する:JSON Unicodeを中国語に変換する実装方法 PHPを深く理解する:JSON Unicodeを中国語に変換する実装方法 Mar 05, 2024 pm 02:48 PM

PHP の深い理解: JSONUnicode を中国語に変換する実装方法 開発中、JSON データを処理する必要がある状況によく遭遇しますが、特に変換する必要がある場合、JSON 内の Unicode エンコードによっていくつかのシナリオで問題が発生します。 Unicode エンコードを漢字に変換する場合。 PHP では、この変換処理を実現するためのメソッドがいくつかありますが、以下では一般的なメソッドを紹介し、具体的なコード例を示します。まず、JSON の Un について理解しましょう

Unicodeを中国語に変換する方法 Unicodeを中国語に変換する方法 Dec 14, 2023 am 10:57 AM

Unicode は、さまざまな言語や記号を表すために使用される文字エンコード標準です。 Unicode エンコードを中国語の文字に変換するには、Python の組み込み関数 chr() および ord() を使用できます。

Eclipseの中国語文字化け問題を解決する方法を試す Eclipseの中国語文字化け問題を解決する方法を試す Jan 03, 2024 pm 05:28 PM

Eclipseで中国語の文字化けに悩んでいませんか?これらのソリューションを試すには、特定のコード サンプルが必要です。 1. 背景の紹介 コンピューター技術の継続的な発展に伴い、ソフトウェア開発において中国語がますます重要な役割を果たしています。しかし、多くの開発者は、中国の開発に Eclipse を使用するとコードの文字化けの問題に遭遇し、作業効率に影響を及ぼします。次に、この記事では、一般的なコードの文字化けの問題をいくつか紹介し、読者が Eclipse での中国語の文字化けコードの問題を解決できるように、対応する解決策とコード例を示します。 2. 一般的なコード文字化けの問題と解決策ファイル

PHP チュートリアル: JSON Unicode を漢字に変換する方法 PHP チュートリアル: JSON Unicode を漢字に変換する方法 Mar 05, 2024 pm 06:36 PM

JSON (JavaScriptObjectNotation) は、Web アプリケーション間のデータ交換に一般的に使用される軽量のデータ交換形式です。 JSON データを処理するとき、Unicode でエンコードされた中国語の文字 (「u4e2du6587」など) が頻繁に発生するため、それらを読み取り可能な中国語の文字に変換する必要があります。 PHP では、いくつかの簡単なメソッドを通じてこの変換を実現できます。次に、JSONUnico を変換する方法を詳しく説明します。

Java が MySQL データベースに接続するときに発生する一貫性のない Unicode 文字セット エンコーディングの問題を解決する Java が MySQL データベースに接続するときに発生する一貫性のない Unicode 文字セット エンコーディングの問題を解決する Jun 10, 2023 am 11:39 AM

ビッグ データやクラウド コンピューティングなどのテクノロジーの発展に伴い、データベースは企業情報化の重要な基盤の 1 つになりました。 Java で開発されたアプリケーションでは、MySQL データベースに接続することが標準になっています。ただし、このプロセスでは、一貫性のない Unicode 文字セットのエンコーディングという厄介な問題に遭遇することがよくあります。これは開発効率に影響を与えるだけでなく、アプリケーションのパフォーマンスと安定性にも影響します。この記事では、この問題を解決し、Java が MySQL データベースによりスムーズに接続できるようにする方法を紹介します。 1. ユニコード

Unicode と ASCII の違いは何ですか Unicode と ASCII の違いは何ですか Sep 06, 2023 am 11:56 AM

Unicode と ASCII の違いには、エンコード範囲の違い、記憶域の違い、互換性の違いなどが含まれます。詳細な紹介: 1. エンコード範囲が異なります。ASCII のエンコード範囲は 0 ~ 127 で、主に英語の文字を表すために使用されます。Unicode のエンコード範囲はさらに広く、ほぼすべての言語の文字を表すことができます。2. ストレージASCII は通常 1 バイトを使用して文字を格納しますが、Unicode は 2 バイト以上を使用して文字を格納する場合があります; 3. 互換性の違いなど

ノードutf8の漢字が文字化けする場合の対処方法 ノードutf8の漢字が文字化けする場合の対処方法 Feb 08, 2023 am 10:29 AM

ノード utf8 での中国語文字化けの解決策: 1. 「typeof」を通じて「SarchName」のタイプを確認します; 2. 「Name=iconv.decode(name,'gbk')」を使用してエンコーディングを utf8 に変換します。

See all articles