2009-11-19 2 views
0

간단한 ASCII 기반 프로토콜을 구현하는 소프트웨어를 향상시키고 있습니다.다국어 필드로 ASCII 프로토콜 개선하기

프로토콜은 여기 ... 간단한 메시지 같은 약간 보이는 무엇의 예입니다 (하지만 동일하지를, 나는 당신에게 실제 프로토콜을 표시 할 수 없습니다) :

AUTH 1 1 200<CR><LF> 

으로 우리는 비슷하게 보이는 응답을 얻습니다.

230 DEVICE 1 STATE AUTH 200 OUTPUT 1 NAME "Photo Black"<CR><LF> 

"Photo Black"이라는 이름은 데이터베이스 sqlite 데이터베이스에서 가져옵니다. 나는 외국어를 지원하기 위해 그것을 향상시켜야한다. 그래서 필자는 "Photo Black"필드가 "선택적으로"따옴표 사이의 UTF-8 문자열로 인코딩되어야한다고 생각했습니다. 클라이언트 응용 프로그램에서 인용 부호로 된 문자열을 해석하고 곧바로 UTF-8 또는 일반 ASCII로 인식 할 수 있도록 표준이 있는지 궁금합니다. 프로토콜을 다시 작성하지 않으려 고합니다. 너무 많은 작업이 필요합니다. 클라이언트가 일부 스페인어 또는 스웨덴어 이름을 인식하도록 인코딩하기 만하면됩니다.

필자는 필드가 항상 UTF-8로 해석되기를 원하지 않습니다. 당신은 C++에서 0xFF를 입력하는 방법을 알고 컴파일러는 이것이 16 진수 문자열이라는 것을 알고 있습니다 ... UTF-8에 해당하는 것이 있습니까? 유감스럽게도 총을 뛸 수도 있지만 일반적으로 UTF-8 인코딩 및 국제화에 익숙하지 않습니다.

답변

2

서버와 클라이언트를 모두 제어 할 수 있습니까? 그렇지 않다면 프로토콜을 변경할 수 없으므로 이 가능하지 않습니다. "프로토콜을 다시 작성하지 않으려 고합니다"라고 말하면 적어도 일부는 범위가되어야합니다. 무슨 일을하든, 이 프로토콜을 변경하게됩니다.

데이터를 UTF-8로 해석하지 않으려 고하는 이유가 확실하지 않습니다. 현재 ASCII로만되어있는 경우에는 완전히 역방향 호환되므로 항상 UTF-8로 해석 할 수 있습니다. ASCII는 UTF-8에서 동일한 방식으로 인코딩됩니다. 아마도 더 많은 정보를 제공 할 수 있다면 더 많은 도움을 줄 수 있습니다.

UTF-8로 인코딩 된 문자열에 접두어를 사용할 수 있습니다 (예 : U :

230 DEVICE 1 STATE AUTH 200 OUTPUT 1 NAME U"Photo UTF-8 stuff here Black"<CR><LF> 

도움이 될까요?

실제로 8 비트 데이터 경로가 있습니까? 어떤 것이 모든 바이트의 맨 위 비트를 괴롭히는 경우 UTF-8 대신에 Punycode과 같은 옵션을 고려해야합니다.

+0

이것은 IMHO, 정말 나쁜 생각입니다. 이 코드를 다루는 코드는 모두 8 비트 코드이거나 그렇지 않습니다. 그렇지 않다면 거기에 U를 넣으면 도움이되지 않습니다. 그렇다면 문자열의 중간에서 여전히 바이트를 가져 오는 것입니다. 다른 프로그램이 중간에 그것을 분할한다면 어떨까요? – bmargulies

+0

"U"는 문자열 내에서 UTF-8을 예상하는 표시기입니다. 나는 최후의 비트에서 무언가가 짓밟 으면 문제가있을 것이라는 데 동의한다. - 내가 마지막 단락에서 말했던 것처럼. 왜 U 접두사가 아닌 문자열을 U 접두사가 아닌 문자열과 다르게 처리해야합니까? 나는 문자열 내에서 * 스위치를 제안하지는 않지만 문자열의 데이터 전체를 UTF-8로 취급하거나 전체를 ASCII로 취급한다. 문자열의 끝을 찾는 것이 문제가되지 않아야합니다. –

+0

예 양쪽에서 모두 제어 할 수 있습니다. 하지만 다른 끝에는 foxpro로 작성된 소프트웨어가있는 또 다른 개발자가 있습니다. 나는 그가 "결국"사용할 ActiveX 컨트롤로 새로운 클라이언트를 작성할 것이지만 다른 공급 업체에 재배포 할 것입니다. 나는 시간을 절약하려고 노력하고있는 것 같아. 나는 또한 텔넷으로 서버에 메시지를 보내는 기능을 좋아한다. – Matt

2

Ascii Compatible Encoding 또는 ACE의 개념을 읽으십시오. iDNS가 그 예입니다. UTF-7도 그렇습니다.

여기는 master입니다.

UTF-8에서 실제로 코드 전환 할 수 없습니다. 악몽을 피우려면 ISO-2022를 찾아보십시오. 그런 일을 지원하려고했습니다. 또한 UTF-8 에는 ASCII가 포함되지만 Latin-1은 포함되지 않습니다.

+0

* 문자열을 전환하는 것은 좋지 않을 수 있습니다. 그러나 UTF-8 인코딩 된 문자열과 ASCII 인코딩 된 문자열이 실제로는 서로 다른 두 종류의 리터럴을 가질 수없는 이유가 없습니다. 끈. –

1

필드를 "항상 UTF-8로 해석"하지 않으려면 어떻게해야합니까? 너는 말하지 않는다.

클라이언트가 프로토콜을 UTF-8로 인코딩 된 텍스트로 해석하면 UTF-8이 ASCII의 적절한 수퍼 세트이기 때문에 기존 출력이 모두 올바르게 작동합니다.