2011-12-21 3 views
0

latin1 테이블에 "Artîsté"문자열이 있습니다. C mysql 커넥터를 사용하여 테이블에서 문자열을 가져온다. 나는 character_set_connection을 utf8로 설정했습니다. ;이것이 latin1인지 utf8인지 어떻게 알 수 있습니까?

"Art\xeest\xe9" 

의 printf 제가 함께 16 진수 값을 출력하는 경우 ("% 02X"(서명 숯불)는 [I])가 보이는 디버거

내가 얻는 각 문자에 대해

41 72 74 EE 73 74 E9 

utf8 또는 latin1인지 어떻게 알 수 있습니까?

답변

1

요는 2 큰 가능성을 가질 수 UTF-8 시퀀스 the schema에서 보듯 :

  • 첫번째 비트 = 0 (ASCII와 같은), 숯 갖는 값당 1 바이트 < = 0x7F의
  • 첫번째 비트 UTF-8 시퀀스 = 1, 계열 길이가> = 2 바이트를 갖는 값>은 0x80으로

이 ISO-8859 부호화

41 72 74 *EE* 73 74 *E9* 
이다

단지 2 스탠드 형> = 0x80으로

것은주의 하시고 조심 ADD 값으로 바이트! 형식이 잘 지정된 UTF-8 시퀀스를 찾았더라도 ISO-8859 chars와 구별 할 수는 없습니다!

+0

2 개의 단일 바이트를 말하면 UTF8은 최대 4 개까지 가질 수 있습니까? EEEE (4 바이트)와 같은 것이겠습니까? – joels

+0

죄송합니다. 올바른 단어를 선택하지 않았습니다. 첫 번째 바이트 EE 두 번째 바이트 E9 하나가 다른 하나 –

4

\x74\xee\x73은 UTF-8 시퀀스가 ​​유효하지 않으므로 UTF-8에는 최상위 비트 세트가 1 바이트 만 실행되지 않습니다. 그래서 둘 중 라틴어 -1이어야합니다.

그러나 올바른 UTF-8 데이터 인 바이트가 표시되면 유효한 UTF-8 일 가능성이있는 Latin-1 일 수 있다는 것을 항상 배제 할 수는 없습니다.

Latin-1에는 유효하지 않은 바이트 (ASCII 제어 문자 0x00-0x1F 및 사용되지 않은 범위 0x7f-0x9F)가 있으므로 Latin-1이 아닌 UTF-8 문자열이 있습니다. 그러나 제 경험으로 볼 때 Windows CP1252가 Latin-1로 잘못 표시되는 것을 보았을 때 일반적으로 보았습니다. 다른 코드 세트에서 Latin-1로 변환하는 경우를 제외하면 모든 코드 포인트를 거부하는 것은 상당히 쓸데없는 일입니다. 당신은 출력합니다. CP1252는 사용되지 않은 바이트도 있지만 많지는 않습니다.

관련 문제