2017-12-02 15 views
3

터키어 단어 목록이 있습니다. 나는 그들의 길이를 비교할 필요가있다. 그러나 일부 터키 문자가 아닌 ASCII 있기 때문에, 나는 그들을 정확하게 비교할 수 없습니다. 비 ASCII 터키 문자는 2 바이트를 보유합니다. 예를 들어비 ASCII (터키어) 문자를 Linux 용 C에서 1 바이트로 압축하는 방법은 무엇입니까?

: 그는 그것을 확장에 특별한 터키어 문자를 채운다 고 말했다

system("chcp 1254"); 

:

#include <stdio.h> 
#include <string.h> 

int main() 
{ 
    char s1[] = "ab"; 
    char s2[] = "çş"; 

    printf("%d\n", strlen(s1)); // it prints 2 
    printf("%d\n", strlen(s2)); // it prints 4 

    return 0; 
} 

내 친구는 아래의 코드 줄에 Windows에서 그렇게하는 것이 가능했다 ASCII 표. 그러나 리눅스에서는 작동하지 않습니다.

Linux에서이를 수행 할 수있는 방법이 있습니까?

+2

모두 사용중인 인코딩에 따라 다릅니다. 문자열에서 인코딩 된 코드 포인트 수를 결정하는 UTF-8 (Linux의 표준)을 사용하면 복잡하지 않습니다. [here] (https://stackoverflow.com/a/44998716/214671)는 기본 사항입니다 (C++이지만 문제의 핵심은 충분히 명확해야합니다). –

+3

터키 문자가 차지하는 바이트 수에 따라 터키어 문자 인코딩에 따라 다릅니다. 이상적으로는 이미 UTF-8 인코딩을 사용하고있을 것입니다. ** variable ** length! 반면 cp1254는 8 비트 (1 바이트) 문자 세트이며 UTF-8과 호환되지 않습니다. (그리고 "확장 된"ASCII와 같은 것은 없습니다). –

+2

utf-16으로 승격하고 NFC 형식으로 정규화 한 다음 2 바이트 문자를 계산합니다. 대부분의 알파벳에 충분합니다. – Dragonthoughts

답변

2

단어를 저장하기 위해 넓은 문자열을 사용할 수도 있습니다. 문자를 1 바이트로 저장하지 않지만 주된 문제를 해결합니다. 당신의 언어로 작동하는 일련의 기능을 얻으려면. 이 프로그램은 같을 것이다 다음

#include <stdio.h> 
#include <string.h> 
#include <wchar.h> 

int main() 
{ 
    wchar_t s1[] = L"ab"; 
    wchar_t s2[] = L"çş"; 

    printf("%d\n", wcslen(s1)); // it prints 2 
    printf("%d\n", wcslen(s2)); // it prints 2 

    return 0; 
} 
4

그것은 2017 곧 2018 그래서 사용 UTF-8 everywhere (최근의 리눅스 배포판에, UTF-8은 확실히 가장 일반적인 대부분의 locale(7) -s 인코딩, 그리고이다 시스템의 기본값); 물론 UTF-8로 코딩 된 Unicode 문자는 1에서 6 바이트까지 가질 수 있습니다. 따라서 일부 UTF-8 문자열의 유니 코드 문자 수는 이 아니며 strlen이 아닌입니다. libunistring과 같은 일부 UTF-8 라이브러리를 사용하는 것이 좋습니다 (예 : Glib).

chcp 1254은 UTF-8 시스템과 관련없는 일부 Windows 관련 항목입니다. 그래서 잊어 버려.

GUI 응용 프로그램을 코딩하는 경우 GTK 또는 Qt과 같은 도구 키트를 사용하십시오. 둘 다 유니 코드를 처리하고 받아 들일 수 있습니다 (또는 UTF-8로 변환 할 수 있음). 문자열이 간단하게 (예 : UTF-8 또는 UTF-16 문자열과 같이) 표시 될 수 있기 때문에 유니 코드를 표시하는 것만으로도 간단합니다. 아랍어, 일본어, 키릴 어 및 영어 단어 (왼쪽에서 오른쪽 및 오른쪽에서 왼쪽 방향으로 모두 표시해야 함)를 사용하여 라이브러리 (또는 UTF-8 가능과 같은 다른 도구)를 찾는 것이 좋습니다. 그.

일부 파일을 가져 오는 경우 사용중인 인코딩을 알아야합니다 (그 중 일부는 사용자가 받아 들일 필요가있는 컨벤션입니다). 일부 경우에는 file(1) 명령을 사용하여 해당 인코딩을 추측하는 데 도움이 될 수 있지만 해당 파일을 만드는 데 사용 된 인코딩 규칙을 이해해야합니다. UTF-8로 인코딩되지 않은 경우 iconv(1) 명령을 사용하여 원본 인코딩을 알고 있으면 변환 할 수 있습니다.