2014-05-22 5 views
0

는 I가 0 끝나는 문자열을 전송하는 방법을 사용할 수있다 :UTF-8 문자열을 변환하는 방법?

버퍼 "UTF-8"또는 "ISO-8859"로 부호화 된 문자열
ssize_t send_utf8 (char *buffer) 

. 이 함수는 버퍼를 보내는 다른 함수를 사용하여 제로로 끝나는 문자열을 전송한다 (이 기능은 투명하고, 상기 버퍼는 이진 데이터 일 수있다) :

버퍼가 버퍼 전송하여야하며 NUM은 수있다
ssize_t send (void *buffer, size_t num) 

바이트.

이 방법을 구현했지만 send() 메서드를 호출하기 전에 UTF-8로 코딩 된 버퍼를 변환해야합니다.

ssize_t send_utf8 (char *buffer) { 

    // UTF-8 conversion? 

    net_http_send(buffer, strlen(buffer)); 

    return connection->content_len; // number of bytes written 
} 

라이브러리를 사용해야합니까, 아니면이 버퍼를 신속하게 변환 할 수 있습니까? 미리 감사드립니다.

+1

* 컴퓨터의 모든 * 데이터는 궁극적으로 "바이너리"입니다. 정교하게 주시겠습니까? 아마도 해당 "2 진"데이터가있는 예제 문자열을 표시 할 것입니까? –

+0

UTF-8은 이미 비트 수준까지 지정된 인코딩입니다. "이진 데이터"를 정의하십시오. – delnan

+0

당신은 문제를 요구하고 있습니다. utf-8로 인코딩 된 문자열을 바이너리 데이터로 올바르게 처리 할 수있는 응용 프로그램은 거의 없습니다. 제대로 utf-8로 인코딩되지 않은 데이터에 넘어 가지 않으면 문자열이 정규화 될 때 데이터가 임의로 손상됩니다. 상용구는 먼저 이진 데이터를 인코딩하는 것이며 base64는 * 매우 * 공통입니다. –

답변

0

UTF-8은 여러 바이트로 표현되므로 이미 '2 진'이므로 '인코딩'할 필요가 없습니다.

그러나 버퍼를 보내고 받으려면 버퍼의 시작/끝을 정의하는 프로토콜이 있어야합니다. UTF-8의 경우 이것은 0 종결 바이트입니다. 버퍼의 경우, 일반적인 규약은 끝에 0 바이트를 검색하는 대신 길이 필드를 접두사로 사용하는 것이지만 다른 규칙도 있습니다.

따라서 UTF-8을 사용하는 방법이 아니라 버퍼 전송 규칙에 따라 다릅니다.

+1

UTF-8이 0으로 종료되었다고 말하는 것은 오해의 여지가 있습니다. UTF-8은 바이트와 코드 포인트 간의 맵핑입니다.이 바이트를 저장하는 방법 (특히 바이트 문자열의 길이/끝을 나타내는 방법)은 직각입니다. 바이트 0에 해당하는 코드 포인트 0은 특별한 의미가 없으며 UTF-8 (및 대부분의 다른 유니 코드 관련 알고리즘)은 어디에서 얼마나 자주 발생하는지 신경 쓰지 않습니다. 길이 프리픽스가있는 UTF-8 문자열을 표현할 수 있으며, 종종 그렇게해야합니다. – delnan

+0

@delnan : UTF8 문자열을 0으로 끝내는 것은 완벽합니다. 그것은 C 문자열 처리와 호환되도록 설계되었습니다. 하지만 당신 말이 맞아. UTF8에는 종료 또는 길이가 필요하지 않습니다. 그 것들은 관심이없는 세부 사항입니다. –

+1

@ZanLynx UTF-8의 제로 터미네이션은 ASCII와 마찬가지로 * 정확합니다. 그것은 둘 다, 그리고 "로마인이 로마인처럼 할 때"(그러나 C를 제외한 다른 언어로) 진공에서, 일반적으로 명백한 길이보다 더 나쁩니다. – delnan

0

Rutger Nijlunsing이 말했듯이 UTF-8 문자열은 이미 바이너리입니다.

버퍼에 저장된 데이터를 전송하는 대부분의 방법은 포인터와 길이 매개 변수를 사용하여 데이터를 전송합니다. 귀하의 경우에는 포인터가 문자열의 시작 부분이되며, 코드의 어딘가에 이미 저장되어 있지 않은 경우 널 종결자를 사용하여 길이를 찾을 수 있습니다.

0

여기서 buffer는 "utf-8"또는 "ISO-8859-1"로 코딩 된 문자열입니다.

이것은 문제가 될 것입니다. 당신은 하나 또는 다른 것을 고르고 그것과 일치해야합니다. buffer가 UTF-8 다음 인코딩 된 경우있는 그대로 당신은 net_http_send()에 전달할 수 있습니다

ssize_t send_utf8 (char *buffer) 
{ 
    net_http_send(buffer, strlen(buffer)); 
    ... 
} 

그러나 다른 인코딩 경우, 먼저 변환해야합니다 :

ssize_t send_utf8 (char *buffer) 
{ 
    char *utf8_buffer = convert_to_utf8(buffer, strlen(buffer)); 
    net_http_send(utf8_buffer, strlen(utf8_buffer)); 
    ... 
} 

을 어떻게을 실제로 그 변환은 개발 환경에 달려 있습니다. C에는 UTF-8 개념이 없습니다 (C++ 11까지 추가되지 않았 음). 따라서 iconv 또는 ICU와 같은 제 3 자 라이브러리를 사용해야하거나 사용자가 직접 변환 코드를 작성할 수 있습니다 (UTF-8은 손으로 구현하기 매우 쉽다). 하지만 어느 쪽이든 buffer이 사용하는 인코딩을 알아야합니다. UTF-32로 디코딩해야만 UTF-8로 다시 인코딩 할 수 있기 때문입니다 (라이브러리가 세부 정보를 처리합니다).