Linux(およびUnix?)のC ++で最も一般的な文字列エンコーディング

Linux(およびUnix?)のC ++で最も一般的な文字列エンコーディング

WindowsとLinuxの間に移植可能なソースコードレベルであり、国際化をうまく処理するC ++プログラムを作成するには、IMHOで考慮する必要がある3つの主要なエンコーディングがあります。

  • C ++ソースコードエンコーディング。
  • 外部データエンコーディング。
  • 文字列とリテラルのエンコーディング。

C ++ソースコードの場合、少なくとも標準入力とワイド文字列リテラルがWindowsプラットフォームで動作する必要がある場合は、BOM付きUTF-8を置き換える方法はありません。 BOMなしでUTF-8を使用すると、MicrosoftのVisual C ++コンパイラはソースコードのWindows ANSIエンコーディングを採用します。これはUTF-8を介した出力には適していますstd::coutが、限られた範囲でのみ機能します(Windowsコンソールウィンドウにはバグがあります)。ただし、viaを入力するとstd::cin機能しません。

外部データの場合、UTF-8は次のようになります。これ事実上標準。

しかし、内部リテラルと文字列はどうですか?ここにあります。印象UTF-8で狭い文字列エンコーディングは、Linuxで一般的なルールです。しかし、最近2人が異なる主張をしました。ある人は、Linuxの国際アプリケーションでは、内部文字列の普遍的な規則がUTF-32であると主張し、もう1人は単にこの点でUnixとLinuxの間に不特定の違いがあると主張します。

この分野のWindows/Linuxの違いを抽象化する小さなライブラリを趣味で少し修正する人として私は...具体的なお問い合わせ

  • プログラムで文字列を表現するための一般的なLinuxルールは何ですか?

私はこの質問™に実際の答えがあるほど非常に一般的な共通の規則があると確信しています。

Linux方式で文字列を反転する方法を示す例(UTF-8を直接使用することは複雑ですが、Linuxの事実上標準関数を介して実行されると推定されています)もお勧めします。つまり、質問としてこのC++ Linuxの一般バージョンは何ですか?プログラム(与えられたコードはC ++の狭いテキスト実行文字セットであるLatin-1用です):

#include <iostream>
#include <algorithm>
#include <string>
using namespace std;

#define STATIC_ASSERT( cond )   static_assert( cond, #cond )

int main()
{
    string line;
    if( getline( cin, line ) )
    {
        static char const aSingleChar[] = "æ";
        STATIC_ASSERT( sizeof( aSingleChar ) - 1 == 1 );
        reverse( line.begin(), line.end() );

        cout << line << endl;
    }
}

ベストアンサー1

あなたの質問はかなり広いので、これは部分的な答えです。

C ++では、「実行文字セット」を定義します(実際には2つの狭い文字セットと2つの広い文字セットがあります)。

ソースファイルに以下が含まれている場合:

char s[] = "Hello";

次に、実行されたエンコードに基づいて文字列リテラル内の文字の数値バイト値を見つけます。 (ホロ広いワイド文字定数に割り当てられた数値には、適用エンコーディングが適用されますL'a'。 )

これはすべて、コンパイルプロセスでソースコードファイルを最初に読み込むプロセスの一部として発生します。内部に入ると、C++ 文字は追加の意味のないバイトにすぎません。 (タイプ名はcharC派生言語で最悪の誤った名前の1つであることに違いありません!)

C++11 にはリテラルu8""u""OK の部分的な例外があります。U""結果文字列要素の値(つまり、結果の値はグローバルに明示的でプラットフォームに依存しません)ですが、これは影響しません。ソースコードを入力してください説明します。

良いコンパイラは次のことを許可する必要があります。指定するソースコードはエンコードされているので、友達がEBCDICシステムからプログラムテキストを送信しても問題はありません。 GCCには次のオプションがあります。

  • -finput-charset:入力文字セット、つまりソースコードファイルがエンコードされる方法
  • -fexec-charset: 実行文字セット、つまり文字列リテラルがエンコードされる方法
  • -fwide-exec-charset: 広い実行文字セット、つまり広い文字列リテラルをエンコードする方法

変換にはGCCが使用されるため、サポートされているiconv()すべてのエンコーディングをiconv()これらのオプションと組み合わせて使用​​できます。

以前に書いたC ++標準は、テキストエンコーディングを処理するためのいくつかの不透明なツールを提供しています。


例:char s[] = "Hello";ソースファイルがASCII(例:コードを入力ASCIIです)。その後、コンパイラはそれを読み、99解釈するcなどの作業を行います。文字通りの意味で見ればと72読んで解釈するH。これで、実行されたエンコード(ASCIIまたはUTF-8の場合)Hによって決定されたバイト値が配列に保存されます。72を書くと、\xFFコンパイラはそれを読み99 120 70 70、デコードし、配列\xFFに書き込みます。255

おすすめ記事