2012-10-16 6 views
4

read 함수를 사용하여 TCP 소켓에서 일부 텍스트 (ISO-8859-1로 알려짐)를 읽은 다음 몇 가지 기본 부분 문자열 대체를 수행합니다. 마지막으로 문자열을 GSM에 해당하는 것으로 변환하고 싶습니다.ISO-8859-1 문자열을 C에서 GSM 문자열로 변환

바람직하게 (그러나 반드시) 나는 이런 식으로 뭔가를 할 것이라고는 :

size_t i; 
for (i=0; i<size; i++) { 
    switch (string[i]) { 
    case 65: 
     //Convert this character 
    case 163: 
     //Convert this character (the pound symbol £) 
    } 
} 

나는 읽기 쉽도록 스위치를 선호하지만,뿐만 아니라 경우-else 문으로 간주했다.

정상적인 ASCII 문자는 작동하지만 ISO-8859-1의 맨 위 부분이 모든 종류의 문제를 일으키고 있습니다. 분명히 그들은 여러 문자로 간주됩니다. 전환을 진행하는 방법에 대한 도움을 주시면 감사하겠습니다.

+1

ISO-8859-1의 위쪽 절반에있는 문자가'string'에 여러 항목으로 나타나는 경우 실제로 ISO-8859-1로 인코딩 된 문자열이 아닌 * 가능성이 매우 높습니다. 또한 [iconv'] (http://linux.die.net/man/1/iconv) 라이브러리 기능을 조사하십시오. – zwol

+0

나는 ISO-8859-1의 상반부가 여러 항목으로 표시되기 때문에 문제가 생기는 이유는 확실하지 않습니다 ... 하지만 케이스 163 (파운드 기호 £)을 만들려고 할 때 컴파일러 시작 불편 : 케이스 라벨 값이 최대 값을 초과했습니다 –

+0

[무엇을 시도 했습니까?] (http://whathaveyoutried.com/) – ecatmur

답변

4

고객님의 케이스에 char이 서명 된 것으로 보입니다. 당신은 문자 리터럴을 사용하여 ASCII 127 이상 char 값의 부호로 모든 문제를 피할 수 :

/* ascii: */ 
case '\000': /* U+0000 - nul */ 
...  
/* extended ascii: */ 
case '\200': /* U+0080 - non-printable control character */ 
... 
case '\243': /* U+00A3 - sterling pound */ 
... 
case '\377': /* U+00ff - lower case y with dieresis */ 

을 변환 배열에서 룩업에 의해 구현하기 위해보다 효율적으로 아마도,하지만.

입력의 "확장 ASCII"부분이 여러 문자로 표시되는 경우 입력 내용이 실제로 UTF-8 또는 이와 유사한 형식으로 인코딩 된 것 같습니다.

+0

이것은 실제로 나를 도와주는 것 같습니다. 고맙습니다. o) 어레이에서 조회로 변환을 구현하는 것이 더 효율적이라고 말하면 무엇을 의미합니까? –

+0

'char map []'과 같은 배열로 매핑을 정의하고 입력 문자의 서수 값을 배열의 인덱스로 사용하여'map [ 'A']'가 A의 코드 (GSM에서 0x41)를 반환하도록합니다. . 음수의 char 값을 처리하기 위해 비트별로 lookup을 위해 0xFF를 사용할 수 있습니다 :'map [c & 0xff]' – Joni

+1

@ Joni : GSM은 사용하기 때문에'std :: string map [256] '일 필요가 있습니다 다중 septet (!) 인코딩. – MSalters