백엔드 개발 PHP 튜토리얼 分割gbk中文出现乱码的有关问题解决

分割gbk中文出现乱码的有关问题解决

Jun 13, 2016 pm 12:28 PM
array encoding explode list string

分割gbk中文出现乱码的问题解决

近日遇到一个神奇的字“弢(tao)”。

具体的过程是这样的:

<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就把弢的第二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>
로그인 후 복사
로그인 후 복사

发现,这种方法并没有什么用处。、

至于原因?“弢”这个字居然不在GB2312的编码集里面!!!!!但是有这个字的编码集(GBK, GB18030)这个函数都不支持!!!!!

既然这个不好用,也许万能的正则表达式是ok的。于是得到以下代码:

<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>
로그인 후 복사

好吧,我想多了。

现在研究一下,如何用正则描述这个场景。

参考一下,鸟哥大神的博客:分割GBK中文遭遇乱码的解决。遗憾的是,正则能力比较low的我,还是想不出来合适的正则表达式(如果有想出这个正则表达式的大神们,希望可以告诉我)。

没办法,思来想去,只好用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>
로그인 후 복사

这样就可以得到正确的结果了。

본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 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 Hentai를 무료로 생성하십시오.

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

Jul 24, 2023 pm 07:55 PM

Java의 String.valueOf() 함수를 사용하여 기본 데이터 유형을 문자열로 변환 Java 개발에서 기본 데이터 유형을 문자열로 변환해야 할 때 일반적인 방법은 String 클래스의 valueOf() 함수를 사용하는 것입니다. 이 함수는 기본 데이터 유형의 매개변수를 허용하고 해당 문자열 표현을 반환할 수 있습니다. 이 기사에서는 기본 데이터 유형 변환을 위해 String.valueOf() 함수를 사용하는 방법을 살펴보고 다음과 같은 몇 가지 코드 예제를 제공합니다.

char 배열을 문자열로 변환하는 방법 char 배열을 문자열로 변환하는 방법 Jun 09, 2023 am 10:04 AM

char 배열을 문자열로 변환하는 방법: 할당을 통해 달성할 수 있습니다. char 배열이 문자열에 직접 값을 할당하고 실행하도록 하려면 {char a[]=" abc d\0efg ";string s=a;} 구문을 사용합니다. 변환을 완료하는 코드입니다.

2w 단어 자세한 설명 문자열, yyds 2w 단어 자세한 설명 문자열, yyds Aug 24, 2023 pm 03:56 PM

안녕하세요 여러분, 오늘은 Java: String에 대한 기본 지식을 여러분과 공유하겠습니다. String 클래스의 중요성은 말할 필요도 없이 우리 백엔드 개발에서 가장 많이 사용되는 클래스라고 할 수 있으므로 이에 대해 이야기할 필요가 있다.

Java의 String.replace() 함수를 사용하여 문자열의 문자(문자열)를 바꿉니다. Java의 String.replace() 함수를 사용하여 문자열의 문자(문자열)를 바꿉니다. Jul 25, 2023 pm 05:16 PM

Java의 String.replace() 함수를 사용하여 문자열의 문자(문자열) 바꾸기 Java에서 문자열은 불변 객체입니다. 즉, 문자열 객체가 생성되면 해당 값을 수정할 수 없습니다. 그러나 문자열에서 특정 문자나 문자열을 바꿔야 하는 상황이 발생할 수 있습니다. 이때 Java의 String 클래스에 있는 replacement() 메소드를 사용하여 문자열 교체를 구현할 수 있습니다. String 클래스의 replacement() 메소드에는 두 가지 유형이 있습니다.

PHP에서 Redis 목록 작업을 구현하는 방법 PHP에서 Redis 목록 작업을 구현하는 방법 May 26, 2023 am 11:51 AM

목록 작업 //목록의 선두에서 값을 삽입합니다. $ret=$redis->lPush('city','guangzhou');//목록 끝에 값을 삽입합니다. $ret=$redis->rPush('city','guangzhou');//목록의 지정된 범위에 있는 요소를 가져옵니다. 0은 목록의 첫 번째 요소를 나타내고, -1은 마지막 요소를 나타내고, -2는 끝에서 두 번째 요소를 나타냅니다. $ret=$redis->l

Jul 25, 2023 am 09:09 AM

문자열의 길이를 얻으려면 Java의 String.length() 함수를 사용하십시오. Java 프로그래밍에서 문자열은 문자열의 길이, 즉 문자열의 문자 수를 가져와야 하는 경우가 많습니다. Java에서는 String 클래스의 length() 함수를 사용하여 문자열의 길이를 얻을 수 있습니다. 다음은 간단한 예제 코드입니다: publicclassStringLengthExample{publ

C#에서 Array.Sort 함수를 사용하여 배열 정렬 C#에서 Array.Sort 함수를 사용하여 배열 정렬 Nov 18, 2023 am 10:37 AM

제목: Array.Sort 함수를 사용하여 C#에서 배열을 정렬하는 예 텍스트: C#에서는 배열이 일반적으로 사용되는 데이터 구조이므로 배열 정렬 작업이 필요한 경우가 많습니다. C#에서는 배열을 편리하게 정렬할 수 있는 Sort 메서드가 있는 Array 클래스를 제공합니다. 이 문서에서는 C#에서 Array.Sort 함수를 사용하여 배열을 정렬하는 방법을 보여주고 구체적인 코드 예제를 제공합니다. 먼저 Array.Sort 함수의 기본 사용법을 이해해야 합니다. 배열.그래서

Golang 함수 바이트, 룬, 문자열 타입 변환 스킬 Golang 함수 바이트, 룬, 문자열 타입 변환 스킬 May 17, 2023 am 08:21 AM

Golang 프로그래밍에서 바이트, 룬 및 문자열 유형은 매우 기본적이고 일반적인 데이터 유형입니다. 문자열 및 파일 스트림과 같은 데이터 작업을 처리하는 데 중요한 역할을 합니다. 이러한 데이터 작업을 수행할 때 일반적으로 서로 변환해야 하며, 이를 위해서는 일부 변환 기술을 숙달해야 합니다. 이 기사에서는 독자가 이러한 데이터 유형을 더 잘 이해하고 프로그래밍 실습에 능숙하게 적용할 수 있도록 돕기 위해 Golang 함수의 바이트, 룬 및 문자열 유형 변환 기술을 소개합니다.

See all articles