2017-03-09 1 views
1

ISO-8859-*에서 UTF-8으로 인코딩을 변환하려면 C에서 iconv.h을 사용하고 있습니다. 들어오는 스트림을 브라우저에 표시해야합니다. 그러나 변환 후 결과가 크롬에 표시되지 않습니다. 다른 브라우저에서는 올바르게 작동합니다. 은 문자열의 샘플을iconv 표시 할 수없는 charchters에서 UTF-8 결과로 변환

char *str = "\x05\x86\x53"; 
char dest_str[100]; 
char *out = dest_str; 
size_t inbytes = strlen(str); 
size_t outbytes = sizeof dest_str; 
printf("Before Conversion: %2x %2x %2x\n",str[0],str[1],str[2]); 
iconv_t conv = iconv_open("UTF-8//TRANSLIT", "ISO-8859-9"); 

if (conv == (iconv_t)-1) { 
    perror("iconv_open"); 
    return 1; 
} 

if (iconv(conv, &str, &inbytes, &out, &outbytes) == (size_t)-1) { 
    perror("iconv"); 
    return 1; 
} 

dest_str[sizeof dest_str - outbytes] = 0; 
printf("After Conversion: %2x %2x %2x\n",dest_str[0],dest_str[1],dest_str[2]); 
puts(dest_str); 

출력 아래와 같습니다 : 변환하기 전에 : 5 ffffff86 53

변환 후 : 5 ffffffc2 ffffff86

이 제대로 일어나고 전환인가? 크롬에서 표시 할 수없는 문자 문제를 해결하는 방법은 무엇입니까?

+0

표시 될 것으로 예상되는 것은 무엇입니까? – JeremyP

답변

0

제가 알 수있는 한, 변환은 정확합니다. 유일한 문제는 UTF-8 문자열에 4 바이트가 있지만 처음 세 개만 인쇄한다는 것입니다.

분명히 05는 인쇄되지 않는 문자입니다. 그것은 의미는 abrowser 컨텍스트에서 의미가 없습니다. (당신은 그것을 보내고있는 이유는 무엇입니까?) 크롬이 그 안에 제어 코드가있는 것을 인쇄하는 것을 거부 할 수 있습니다.

0x86에서 0xC2 0x86으로의 변환이 정확합니다. 그러나 사용중인 글꼴에 글리프가 없을 수도 있습니다. 내 Mac에서는 이것이 사실 인 것처럼 보입니다.

편집

는 당신이 번역하는 순서가 하나 개의 ASCII 제어 코드 (0x05가) 하나 개의 정의되지 않은 문자 (에는 0x86)와 하나 개의 ASCII 인쇄 가능한 문자 (에는 0x53 또는 S)이 포함되어 있음을 밝혀 ISO-8859-9을 체크 아웃 가졌어요. UTF-8 로의 변환은 ASCII 문자 (인쇄 가능 또는 불가능)를 그대로 유지하지만 비 ASCII 문자를 UTF-8 2 바이트 시퀀스로 올바르게 변환합니다. 세 개의 문자 중 두 개는 텍스트로 렌더링 될 때 의미가 없으며 Chrome은이를 분명히 거부합니다.

+0

변환은 어떻게 이루어 집니까? 브라우저에 데이터를 보내기 전에 제어 문자를 제거하고 싶습니다. 따라서 문자열 대신 0xC2 0x86 대신 2 바이트의 데이터를 제거해야합니까? –

+0

'C2 86'은 제어 문자가 아니며, 멀티 바이트 UTF-8 문자입니다. '05'는 제어 문자이므로 제거해야합니다. – JeremyP

+0

031 및 127 tp 159의 문자는 제어 문자 [link] (https://www.obliquity.com/computer/html/unicode0000.html)의 범주에 속합니다. U + 0086은 실제로 선택된 영역으로 표시됩니다 –

관련 문제