PHPでは英語混合版で文字列を扱う際によく使われる関数です。
2815 ワード
同前 ある位置が中国語の文字の左か右半分か、あるいは中国語でないかを判断します。 # 戻り値 -1 左 0 中国語の文字ではありません 1 右側 # 使い方 /* $a. = 'this is 中国語 print is_chinese($a 1) // 0 print is_chinese($a,8) // -1 print is_chinese($a,9) // 1 */ 機能 is_chinese(&$str) $location) { $ch = true; $i = $location; while(ord($str[$i])>0 xa && $i >= 0) { $ch = !$ch; $i --; } if($i) != $location) { $f_str = $ch ? 1: -1; } else { $f_str = false; } return $f_str } # 中国語文字列逆さま関数 # 一つは中国語の文字列をstrevで逆さまにすると文字化けが発生します。 /* print strev('this) is 中国語 // 文の中 シンプル siht */ 機能 c strev(&$str) { $long = streen($str) for($f_)str=' $chinese=false、 $i=$long-1; $i>=0 $i--) { if(ord($str[$i]) > 0 xa 0) { $chinese = ! $chinese; if($chinese) == false { $f_str .= $str[$i].$str[$i+1] } } else { $f_str .= $str[$i]; } } return $f_str } /* 中国語文字列切り取り関数 いくつかの中国語文字列の切り取り関数には、常にいくつかの問題があります。 $a=「1中2」 二回切り取った後、 csubstr($str、$a、0、2) csubstr($str) $a, 2,2) キャリアの位置は「中」の右バイトを指すため、このような結果になるかもしれません。 1, 2 この関数を使うと、正しい結果が得られます。 1において、 2 */ # start 開始位置は、0から開始します。 # long = 0 startから 文字列の最後まで取ります。 # ltor = true を選択します。 を選択します。 # $cn_len 中国語の文字はバイトでとりますか?それとも字数でとりますか?字数でとりますと、中国語は一つのバイトで計算します。 機能 csubstr(&$str) $start=0、 $long=0、 $ltor=true、 $cn_len=2) { if($long) == 0) $long = streen($str) if($ltor) == false $str = c strev($str) if($cn_)len == 1) { for($i=0) $fs=0 $i<$start; $fs++) $i += (ord($str[$fs]) <= 0 xa 0) ? 1 : 0.5; for($i=0) $fe=$fs; $i<$long; $fe++) $i += (ord($str[$fe]) <= 0 xa 0) ? 1 : 0.5; $long = $カフェ。 - $fs; } else { $fs = (is_chinese($str) $start == 1) ? $start - 1 : $start $カフェ。 = $long + $start - 1; $end = ( is_chinese($str) $fe) == -1 ) ? $カフェ。 -1 : $fe; $long = $end - $fs + 1; } $f_str = substr($str) $fs $long); if($ltor) == false $f_str = c strev($f_)str return $f_str } # 左文字列を取ります # cn_をするlen == 2 時刻 $long 左の何文字を取りますか?逆に左の何バイトを取りますか? 機能 cleft(&$str) $long、 $cn_len=2) { $f_str = csubstr($str) 0, $long、 true、 $cn_len; return $f_str } # 右文字列を取る 機能 cright(&str) $long、 $cn_len=2) { $f_str = c strev($str) $f_str = csubstr($f_)str 0, $long、 true、 $cn_len; $f_str = c strev($f_)str return $f_str } # 中国語の文字を含む文章の支店フォーマット # 改行問題による様々な問題は二度と発生しません。 # 注:文章の各行は必ず使われます。 n (chr(13)は支店を行います。 # $width 各行の文字数 # $br 将 行ごとに何の文字を使いますか? 機能 ctext_wrap(&$text) $width=60、 $br=「
」) { $ライン = explode("n"text); $ローソン = count($lines) for($i=0) $i<$ローソン; $i++) { $len = streen($lines[$i]); for($j=0) $j<$len; $j+=$width) { $p = $j + $width - 1; $k = 0; if($p<$len) { while(is_chinese($lines[$i]) $p) && $ライン[$i][$p] != ' ' && $p>$j) { $k ++; $p --; } if($p == $j) $k = 0; } $f_str .= csubstr($lines[$i])は、 $j, $width-$k) . $br; $j -= $k; } } return $f_str }
」) { $ライン = explode("n"text); $ローソン = count($lines) for($i=0) $i<$ローソン; $i++) { $len = streen($lines[$i]); for($j=0) $j<$len; $j+=$width) { $p = $j + $width - 1; $k = 0; if($p<$len) { while(is_chinese($lines[$i]) $p) && $ライン[$i][$p] != ' ' && $p>$j) { $k ++; $p --; } if($p == $j) $k = 0; } $f_str .= csubstr($lines[$i])は、 $j, $width-$k) . $br; $j -= $k; } } return $f_str }