gbk中国語分割時の文字化け問題を解決
最近、「韬(タオ)」という魔法の言葉に出会いました。
具体的なプロセスは次のとおりです。
<span style="color: #008080;">1</span> <span style="color: #800080;">$list</span> = <span style="color: #008080;">explode</span>('|', 'abc弢|bc'<span style="color: #000000;">);</span><span style="color: #008080;">2</span> <span style="color: #008080;">var_dump</span>(<span style="color: #800080;">$list</span>);
このセグメンテーションの結果を取得します。
想像に反して、実際の結果は次のようになります。
<span style="color: #0000ff;">array</span>(3<span style="color: #000000;">) { [</span>0]=> <span style="color: #0000ff;">string</span>(4) "<span style="color: #000000;">abc? [1]=> string(0) </span>""<span style="color: #000000;"> [2]=> string(2) </span>"bc"<span style="color: #000000;">}</span>
文字化けが発生し、意味不明の空の要素が表示されます。
その理由は、単語「韬」の gbk エンコードが 8f7c であり、 | の ASCII が 7c であることが判明したためです。したがって、explode は 韬 の 2 番目の ASCII を | としてカットします。 。
全角の問題なのでmbstringで解決しました。
残念ながら、PHP には mb_explode のような関数はありません。検索したところ、mb_split が見つかりました。
<span style="color: #0000ff;">array</span> mb_split ( <span style="color: #0000ff;">string</span> <span style="color: #800080;">$pattern</span> , <span style="color: #0000ff;">string</span> <span style="color: #800080;">$string</span> [, int <span style="color: #800080;">$limit</span> = -1 ] )
エンコーディングを宣言する場所がありません。よく見ると、mb_regex_encoding 宣言によってエンコードされていることがわかります。
そこで、次のコードを書きました:
<span style="color: #008080;">1</span> mb_regex_encoding('gbk'<span style="color: #000000;">);</span><span style="color: #008080;">2</span> <span style="color: #800080;">$list</span> = mb_split('\|', 'abc弢|bc'<span style="color: #000000;">);</span><span style="color: #008080;">3</span> <span style="color: #008080;">var_dump</span>(<span style="color: #800080;">$list</span>);
その結果、php はエラーを報告しました。mb_regex_encoding は gbk を認識しません。
次に、それを使用して次のことを確認します:
<span style="color: #008080;">1</span> mb_regex_encoding('gb2312'<span style="color: #000000;">);</span><span style="color: #008080;">2</span> <span style="color: #800080;">$list</span> = mb_split('\|', 'abc弢|bc'<span style="color: #000000;">);</span><span style="color: #008080;">3</span> <span style="color: #008080;">var_dump</span>(<span style="color: #800080;">$list</span>);
結果:
<span style="color: #0000ff;">array</span>(3<span style="color: #000000;">) { [</span>0]=> <span style="color: #0000ff;">string</span>(4) "<span style="color: #000000;">abc? [1]=> string(0) </span>""<span style="color: #000000;"> [2]=> string(2) </span>"bc"<span style="color: #000000;">}</span>
このメソッドが見つかりました これはありません使用。 ,
その理由は? 「Tao」という単語は GB2312 のコード セットにはありません。 ! ! ! !ただし、この関数はこの文字のエンコーディング セット (GBK、GB18030) をサポートしていません。 ! ! ! !
これは使いにくいので、汎用の正規表現でも大丈夫かもしれません。次のコードを取得しました:
<span style="color: #008080;">1</span> <span style="color: #008080;">var_dump</span>(<span style="color: #008080;">preg_match_all</span>('/([^\|])*/', 'abc弢|bc', <span style="color: #800080;">$matches</span><span style="color: #000000;">));</span><span style="color: #008080;">2</span> <span style="color: #008080;">var_dump</span>(<span style="color: #800080;">$matches</span>);
結果:
int(2<span style="color: #000000;">)</span><span style="color: #0000ff;">array</span>(2<span style="color: #000000;">) { [</span>0]=> <span style="color: #0000ff;">array</span>(2<span style="color: #000000;">) { [</span>0]=> <span style="color: #0000ff;">string</span>(4) "<span style="color: #000000;">abc? [1]=> string(2) </span>"bc"<span style="color: #000000;"> } [1]=> array(2) { [0]=> string(1) </span>"?<span style="color: #000000;"> [</span>1]=> <span style="color: #0000ff;">string</span>(1) "c"<span style="color: #000000;"> }}</span>
わかりました、考えすぎました。
次に、正規表現を使用してこのシーンを説明する方法を学習しましょう。
参考までに、Niao 兄弟のブログ: GBK を中国語に分割するときに文字化けする問題を解決する方法。残念ながら、正規表現能力が比較的低い私には、適切な正規表現がまだ思いつきません(この正規表現を思いついた達人がいたら教えてほしいです)。
悩んだ末、substr を使うしかありませんでした:
<span style="color: #008080;"> 1</span> <span style="color: #0000ff;">function</span> mb_explode(<span style="color: #800080;">$delimiter</span>, <span style="color: #800080;">$string</span>, <span style="color: #800080;">$encoding</span> = <span style="color: #0000ff;">null</span><span style="color: #000000;">){</span><span style="color: #008080;"> 2</span> <span style="color: #800080;">$list</span> = <span style="color: #0000ff;">array</span><span style="color: #000000;">();</span><span style="color: #008080;"> 3</span> <span style="color: #008080;">is_null</span>(<span style="color: #800080;">$encoding</span>) && <span style="color: #800080;">$encoding</span> =<span style="color: #000000;"> mb_internal_encoding();</span><span style="color: #008080;"> 4</span> <span style="color: #800080;">$len</span> = mb_strlen(<span style="color: #800080;">$delimiter</span>, <span style="color: #800080;">$encoding</span><span style="color: #000000;">);</span><span style="color: #008080;"> 5</span> <span style="color: #0000ff;">while</span>(<span style="color: #0000ff;">false</span> !== (<span style="color: #800080;">$idx</span> = mb_strpos(<span style="color: #800080;">$string</span>, <span style="color: #800080;">$delimiter</span>, 0, <span style="color: #800080;">$encoding</span><span style="color: #000000;">))){</span><span style="color: #008080;"> 6</span> <span style="color: #800080;">$list</span>[] = mb_substr(<span style="color: #800080;">$string</span>, 0, <span style="color: #800080;">$idx</span>, <span style="color: #800080;">$encoding</span><span style="color: #000000;">);</span><span style="color: #008080;"> 7</span> <span style="color: #800080;">$string</span> = mb_substr(<span style="color: #800080;">$string</span>, <span style="color: #800080;">$idx</span> + <span style="color: #800080;">$len</span>, <span style="color: #0000ff;">null</span>, <span style="color: #800080;">$encoding</span><span style="color: #000000;">);</span><span style="color: #008080;"> 8</span> <span style="color: #000000;"> } </span><span style="color: #008080;"> 9</span> <span style="color: #800080;">$list</span>[] = <span style="color: #800080;">$string</span><span style="color: #000000;">;</span><span style="color: #008080;">10</span> <span style="color: #0000ff;">return</span> <span style="color: #800080;">$list</span><span style="color: #000000;">; </span><span style="color: #008080;">11</span> }
テストコード:
<span style="color: #008080;">1</span> <span style="color: #800080;">$a</span> = 'abc弢|bc'<span style="color: #000000;">;</span><span style="color: #008080;">2</span> <span style="color: #008080;">3</span> <span style="color: #008080;">var_dump</span>(mb_explode('|', <span style="color: #800080;">$a</span>, 'gbk'<span style="color: #000000;">));</span><span style="color: #008080;">4</span> <span style="color: #008080;">var_dump</span>(mb_explode('bc', <span style="color: #800080;">$a</span>, 'gbk'<span style="color: #000000;">));</span><span style="color: #008080;">5</span> <span style="color: #008080;">var_dump</span>(mb_explode('弢', <span style="color: #800080;">$a</span>, 'gbk'));
結果:
<span style="color: #0000ff;">array</span>(2<span style="color: #000000;">) { [</span>0]=> <span style="color: #0000ff;">string</span>(5) "abc弢"<span style="color: #000000;"> [</span>1]=> <span style="color: #0000ff;">string</span>(2) "bc"<span style="color: #000000;">}</span><span style="color: #0000ff;">array</span>(3<span style="color: #000000;">) { [</span>0]=> <span style="color: #0000ff;">string</span>(1) "a"<span style="color: #000000;"> [</span>1]=> <span style="color: #0000ff;">string</span>(3) "弢|"<span style="color: #000000;"> [</span>2]=> <span style="color: #0000ff;">string</span>(0) ""<span style="color: #000000;">}</span><span style="color: #0000ff;">array</span>(2<span style="color: #000000;">) { [</span>0]=> <span style="color: #0000ff;">string</span>(3) "abc"<span style="color: #000000;"> [</span>1]=> <span style="color: #0000ff;">string</span>(3) "|bc"<span style="color: #000000;">}</span>
このようにして、正しい結果を得ることができます。