C++에서 한자 문자열 의 캡 처
const char *str = "test test";
while(*str)
{
// 0x80 , GBK
// , 0x80,
//
// , GBK
if(*str > 0x80)
{
// , ++
str += 2;// +2
}
else
{
str++;
}
}
2、아래 문자열 변환 함 수 를 참조 하 십시오.
/**
* getBytes(encoding): byte
* b[0] 63 ,
* A、 :
* 1、encoding GB2312 , byte ;
* 2、encoding ISO8859_1 ,b[i] 63。
* B、 :
* 1、encoding ISO8859_1 , byte ;
* 2、encoding GB2312 ,b[i] 63。
* C、
* 1、encoding ISO8859_1 GB2312 , byte 0;
* : , getBytes("iso8859_1")
* 1、 b[i] 63, ; A-2
* 2、 b[i] 0, , ; B-1
* 3、 b[i] 0 , , 。 C-1
*/
private static String toGb2312(String str) {
if (str == null) return null;
String retStr = str;
byte b[];
try {
b = str.getBytes("ISO8859_1");
for (int i = 0; i < b.length; i++) {
byte b1 = b[i];
if (b1 == 63)
break; //1
else if (b1 > 0)
continue;//2
else if (b1 < 0) { // 0,0
retStr = new String(b, "GB2312");
break;
}
}
} catch (UnsupportedEncodingException e) {
// e.printStackTrace();
}
return retStr;
}
3、
unsigned char *str = "test test";
int length;
int i;
length = strlen(str);
for (i = 0; i < length - 1; i++)
{
if ( *str >= 0x81 && *str <= 0xFE
&& *(str + 1) >= 0x40 && *(str + 1) <= 0xFE)
{
//
}
}
unsignedchar*str="test test";// “ A” , 2
어떤 사람 은 GBK 한 자 는 두 개의 char 공간(2 바이트)을 차지 하고 첫 번 째 바이트 의 값 은 0 보다 작다 고 말 했다.이에 근거 하여 한자 인지 아 닌 지 를 판단 할 수 있다.1.왜 첫 번 째 바이트 의 값 이 0 보다 작 습 니까?2.첫 번 째 바이트 가 0 보다 작 으 면 이 바이트 와 다음 바이트 가 한 자 를 구성 하 는데 이런 논 리 는 안전 합 니까?3.GBK 인 코딩 한 자 는 높 은 자리 와 낮은 자리,첫 번 째 는 낮은 자리 라 는 말 도 있 기 때 문 이 죠?첫 번 째 바이트 가 160-254 사이 이 고 두 번 째 바이트 가 64-254 사이 여야 합 니 다.이렇게 하면 2 에서 언급 한 방법 보다 안전 하지 않 습 니까?4.DB 의 문자 집합 이 SIMPLIFIED CHINESE 라면CHINA.ZHS16GBK,이게 GBK 문자 집합 인가요?GBK 호 환 GB 2312 는 한자 가 세 개의 바이트 에서 차지 하 는 것 같다.'첫 번 째 바이트 가 0 보다 작 으 면 이 바이트 와 다음 바이트 가 하나의 한 자 를 구성한다'//GBK 한자 내부 코드 범위/81-A0,40-7E 80-FE///AA-AF,40-7E 80-A0/B0-D6,40-7E 80-FE///D7,40-7E 80-F9/D8-F7,40-7E 80-FE//F8-FE,40-7E 80-A0 예 를 들 어/81-A0,40-7E 80-FE 문자 의 ascii 코드 는 129-160,64-126,128-254 세 구간 내 에 있어 야 합 니 다.4.작업 중 에 캡 처 할 문자열 이 화면 에 표 시 됩 니 다.문자열 에 한자 가 있 기 때문에 캡 처 가 잘 되 지 않 으 면 어 지 러 움 을 일 으 킬 수 있 습 니 다.아래 함 수 를 썼 습 니 다.
ulinux 에서 VC 6.0 과 테스트 를 통과 할 수 있 습 니 다.
view plaincopy to clipboardprint?
/*
name :
store:
len:
*/
void split_name( char * name , char * store , int len )
{
int i= 0 ;
char strTemp[L(NAMEL)]={0};
if ( strlen(name)
{
strcpy( store, name ); *name=0;
return ;
}
// 1
while( i < len )
{
if ( name[i]>>7&1 && name[i+1]>>7&1 ) //if ( name[i] < 0 && name[i+1] < 0 )
i = i + 2 ;
else
i = i + 1 ;
}
i = i > len ? i-3 :i-1;
strncpy( store , name , i+1 ); // i+1
*(store+i+1)=0;
strcpy( strTemp , name + i + 1 );
strcpy( name , strTemp );
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
PHP에서 한자 변환 위치 코드 응용 원본 실례 해석 실현<?php global $PHP_SELF; //echo $PHP_SELF; $t1=$_POST['textfield1']; $t2=$_POST['textfield2']; $t3=$_POST['textfield3']; ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.