ホームページ バックエンド開発 PHPチュートリアル 真正根据utf8编码的规律来进行截取字符串的函数(utf8版sub_str )_php技巧

真正根据utf8编码的规律来进行截取字符串的函数(utf8版sub_str )_php技巧

May 17, 2016 am 09:08 AM
utf8 インターセプト文字列

复制代码 代码如下:

/*
* 功能: 作用跟substr一样,除了它不会造成乱码
* 参数:
* 返回:
*/
function utf8_substr( $str , $start , $length=null ){
// 先正常截取一遍.
$res = substr( $str , $start , $length );
$strlen = strlen( $str );
/* 接着判断头尾各6字节是否完整(不残缺) */
// 如果参数start是正数
if ( $start >= 0 ){
// 往前再截取大约6字节
$next_start = $start + $length; // 初始位置
$next_len = $next_start + 6 $next_segm = substr( $str , $next_start , $next_len );
// 如果第1字节就不是 完整字符的首字节, 再往后截取大约6字节
$prev_start = $start - 6 > 0 ? $start - 6 : 0;
$prev_segm = substr( $str , $prev_start , $start - $prev_start );
}
// start是负数
else{
// 往前再截取大约6字节
$next_start = $strlen + $start + $length; // 初始位置
$next_len = $next_start + 6 $next_segm = substr( $str , $next_start , $next_len );
// 如果第1字节就不是 完整字符的首字节, 再往后截取大约6字节.
$start = $strlen + $start;
$prev_start = $start - 6 > 0 ? $start - 6 : 0;
$prev_segm = substr( $str , $prev_start , $start - $prev_start );
}
// 判断前6字节是否符合utf8规则
if ( preg_match( '@^([\x80-\xBF]{0,5})[\xC0-\xFD]?@' , $next_segm , $bytes ) ){
if ( !empty( $bytes[1] ) ){
$bytes = $bytes[1];
$res .= $bytes;
}
}
// 判断后6字节是否符合utf8规则
$ord0 = ord( $res[0] );
if ( 128 = $ord0 ){
// 往后截取 , 并加在res的前面.
if ( preg_match( '@[\xC0-\xFD][\x80-\xBF]{0,5}$@' , $prev_segm , $bytes ) ){
if ( !empty( $bytes[0] ) ){
$bytes = $bytes[0];
$res = $bytes . $res;
}
}
}
return $res;
}

测试数据::
复制代码 代码如下:

$str = 'dfjdjf测13f试65&2数据fdj(1就mfe&……就';
var_dump( utf8_substr( $str , 22 , 12 ) ); echo '
';
var_dump( utf8_substr( $str , 22 , -6 ) ); echo '
';
var_dump( utf8_substr( $str , 9 , 12 ) ); echo '
';
var_dump( utf8_substr( $str , 19 , 12 ) ); echo '
';
var_dump( utf8_substr( $str , 28 , -6 ) ); echo '
';

显示结果::(截取无乱码, 欢迎大家测试, 提交bug)
string(12) "据fdj"
string(26) "据fdj(1就mfe&…"
string(13) "13f试65&2数"
string(12) "数据fd"
string(20) "dj(1就mfe&…"
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、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衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の 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 バイトが必要です。エンコーディング。

Go言語で文字列をインターセプトする方法 Go言語で文字列をインターセプトする方法 Mar 13, 2024 am 08:33 AM

Go 言語は、文字列インターセプトを含む豊富な文字列処理機能を提供する強力で柔軟なプログラミング言語です。 Go 言語では、スライスを使用して文字列をインターセプトできます。次にGo言語で文字列をインターセプトする方法を具体的なコード例を交えて詳しく紹介します。 1. スライスを使用して文字列をインターセプトする Go 言語では、スライス式を使用して文字列の一部をインターセプトできます。スライス式の構文は次のとおりです。slice:=str[start:end]where, s

Go言語で文字列をインターセプトする方法 Go言語で文字列をインターセプトする方法 Jan 12, 2023 pm 04:02 PM

インターセプト方法: 1. 単一文字をインターセプトします。構文は「string[index]」です。「string」はソース文字列を表し、「index」は取得する文字の添え字を表します。 2. 部分文字列をインターセプトします。構文は次のとおりです。 "string[start: end" ]"、"start" はインターセプトされる最初の文字のインデックス (インターセプト時にこの文字も含む)、"end" はインターセプトされる最後の文字のインデックス (この文字を除く) を表します。 ; 3. 文字列全体を取得します (構文「string[:]」)。

MySQL で LEFT 関数を使用して文字列の左側の部分をインターセプトする方法 MySQL で LEFT 関数を使用して文字列の左側の部分をインターセプトする方法 Jul 12, 2023 pm 01:37 PM

MySQL で LEFT 関数を使用して文字列の左側の部分をインターセプトする方法 データベース管理システムでは、文字列から特定の部分をインターセプトする必要がある状況によく遭遇します。 MySQL には、文字列の左側の部分をインターセプトするために使用できる LEFT 関数など、多くの組み込み文字列関数が用意されています。 LEFT 関数の構文は次のとおりです。 LEFT (str, length) ここで、str はインターセプトされる文字列、length はインターセプトされる長さです。次に、コード例を使用して、その方法を示します。

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

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

PHP の substr() 関数: 文字列の一部をインターセプトする方法 PHP の substr() 関数: 文字列の一部をインターセプトする方法 Nov 03, 2023 am 10:43 AM

PHP の substr() 関数: 文字列の一部をインターセプトする方法には特定のコード例が必要です PHP プログラミングでは、文字列処理は最も一般的な操作の 1 つです。文字列の一部をインターセプトすることは、文字列を処理するときによく発生する要件です。 PHP では、組み込みの substr() 関数を使用して文字列の一部をインターセプトできます。この記事では、substr()関数の使い方を詳しく紹介し、具体的なコード例を示します。 substr() 関数の基本的な使用法は次のとおりです。

MySQL の LEFT 関数を使用して、指定された長さの文字列をインターセプトします。 MySQL の LEFT 関数を使用して、指定された長さの文字列をインターセプトします。 Jul 25, 2023 pm 05:04 PM

MySQL の LEFT 関数を使用して、指定された長さの文字列をインターセプトします。MySQL では、特定のニーズを満たすために文字列をインターセプトする必要があることがよくあります。中でもLEFT関数は指定した長さの文字列をインターセプトできる非常に実用的な関数です。この記事では、MySQL の LEFT 関数を使用して文字列をインターセプトする方法とコード例を紹介します。まず、LEFT 関数の構文を理解する必要があります。 LEFT 関数の基本構文は次のとおりです。 LEFT(string,lengtht

MySQL で RIGHT 関数を使用して文字列の右側の部分をインターセプトする方法 MySQL で RIGHT 関数を使用して文字列の右側の部分をインターセプトする方法 Jul 12, 2023 am 10:20 AM

MySQL で RIGHT 関数を使用して文字列の右側の部分をインターセプトする方法 MySQL では、RIGHT 関数は文字列の右側の部分をインターセプトするために使用される関数です。インターセプトする文字列とインターセプトする長さの 2 つのパラメーターを受け取り、指定された長さを含む文字列を返します。 RIGHT 関数を使用すると、文字列の正しい部分を簡単に取得できます。以下では、コード例を通して RIGHT 関数の使用方法を示します。まず、インターセプトする文字列を保存するサンプル データ テーブルを作成する必要があります。 CR

See all articles