10

ASCII 文字セット用に開発された一連のアプリケーションがあります。現在、アイスランドにインストールしようとしていますが、アイスランドの文字が台無しになるという問題が発生しています。

私たちは問題に取り組んでいますが、疑問に思っていました.8ビット文字用に設計され、UTF-8データが与えられたときに適切に動作するC++コードを書くための良い「ガイド」はありますか?

誰もが Unicode 標準全体を読むことは期待できませんが、より理解しやすいものがある場合は、チームと共有して、これらの問題に再び遭遇しないようにしたいと思います.

wchar_t またはその他の文字列表現を使用するようにすべてのアプリケーションを書き直すことは、現時点では実行できません。また、これらのアプリケーションはネットワークを介して 8 ビット文字を使用するサーバーやデバイスと通信するため、内部で Unicode を使用したとしても、境界での変換に問題が残ることにも注意してください。ほとんどの場合、これらのアプリケーションはデータを渡すだけです。テキストをあちこちにコピーする以外の方法でテキストを「処理」することはありません。

使用するオペレーティング システムは、Windows と Linux です。std::string と単純な古い C 文字列を使用します。(そして、設計上の決定を擁護するように私に頼まないでください。私は混乱を正す手助けをしようとしているだけです。)


提案されたもののリストは次のとおりです。

4

8 に答える 8

10

ほとんどの場合、8ビットクリーンにしてください。ただし、ASCII 以外の文字は複数のバイトに分割されることに注意する必要があるため、表示のためにテキストを改行または切り詰める場合は、これを考慮する必要があります。

UTF-8 には、マルチバイト文字のどこにいるかを常に知ることができるという利点があります。ビット 7 が設定され、ビット 6 がリセットされた場合 (バイトは 0x80-0xBF)、これは末尾のバイトであり、ビット 7 と 6 がセットされ、5 はリセットされます (0xC0-0xDF)。これは先行バイトであり、後続バイトが 1 つあります。7、6、および 5 が設定され、4 がリセットされた場合 (0xE0-0xEF)、それは 2 つの後続バイトを持つ先行バイトであり、以下同様です。最上位ビットに設定された連続ビット数は、文字を構成する総バイト数です。あれは:

110x xxxx = 2 バイト文字
1110 xxxx = 3 バイト文字
1111 0xxx = 4 バイト文字
など

アイスランドのアルファベットはすべて ISO 8859-1 に含まれているため、Windows-1252 に含まれています。これがコンソール モードのアプリケーションである場合、コンソールは IBM コードページを使用することに注意してください。そのため、(システム ロケールに応じて) 437、850、または861で表示される場合があります。Windows は UTF-8 のネイティブ表示をサポートしていません。UTF-16 に変換し、Unicode API を使用する必要があります。

コードページ 1252 を指定して SetConsoleCP と SetConsoleOutputCP を呼び出すと、コンソール モード アプリケーションの場合、問題の解決に役立ちます。残念ながら、選択したコンソール フォントはコードページをサポートするフォントでなければならず、フォントを設定する方法がわかりません。標準のビットマップ フォントは、システムの既定の OEM コードページのみをサポートします。

于 2008-09-25T17:54:24.223 に答える
3

これは包括的なクイックガイドのように見えます:
http ://www.cl.cam.ac.uk/~mgk25/unicode.html

于 2008-09-25T16:45:07.837 に答える
1

icuをチェックしてみてください。UTF-8 文字列の操作を容易にする機能が利用できる場合があります。

于 2008-09-25T18:11:11.593 に答える
1

完全な Unicode は 16 ビット文字に収まらないことに注意してください。そのため、32 ビット文字または可変幅エンコーディング (UTF-8 が最も一般的です) を使用してください。

于 2008-09-25T16:59:05.133 に答える
1

UTF-8 は、まさにあなたの問題を念頭に置いて設計されました。私が注意することの 1 つは、ASCII は実際には 7 ビットのエンコーディングであるため、インフラストラクチャの一部が他の目的で 8 番目のビットを使用している場合、注意が必要なことです。

于 2008-09-25T17:13:41.463 に答える
0

アイスランド語は、フランス語、ドイツ語、および西ヨーロッパの他のほとんどの言語と同様に、8ビット文字セット(WindowsではCP1252、* xではISO8859-1、別名Latin1)を使用してサポートできます。これはUnicodeが発明される前の標準的なアプローチであり、今でもかなり一般的です。あなたが言うように、wcharを使用するようにアプリを書き直すことはできないという制約があり、その必要はありません。

UTF-8が問題を引き起こしていることに驚かないでください。UTF-8は、非ASCII文字(アクセント付きラテン文字、とげ、ethなど)をそれぞれ2バイトとしてエンコードします。

与えることができる唯一の一般的なアドバイスは非常に単純です(理論的には):( 1)システムでサポートする文字セット(Unicode、Latin1、CP1252、...)を決定します(2)供給されている場合他の方法(UTF-8など)でエンコードされたデータを、他の方法でエンコードされたデータを提供する必要がある場合は、システム境界(3)で標準(CP1252など)にトランスコードします...

于 2009-06-29T13:20:02.893 に答える
0

アイスランド語は ISO Latin 1 を使用するため、8 ビットで十分です。何が起こっているのかを理解するには、より詳細な情報が必要です。

于 2008-09-25T17:05:49.003 に答える
-1

ワイド文字 (char の代わりに wchar_t、std::string の代わりに std::wstring) を使用することもできます。これで問題が 100% 自動的に解決されるわけではありませんが、最初のステップとしては適切です。

Unicode 対応の文字列関数も使用してください (ドキュメントを参照してください)。何かがワイド文字または文字列を操作する場合、通常はそれらがワイドであることを認識しています。

于 2008-09-25T16:39:12.657 に答える