2
std::stringstream stream_french;
stream_french.imbue(std::locale("")); // French_France.1252
stream_french << 1000;
std::string value_french = stream_french.str();

このコードは 1000 を文字列 "1 000" に変換しますが、value_french[1] の値は 32 ではなく -96 です。なぜですか?

value_french[0] = 49
value_french[1] = -96 
value_french[2] = 48
value_french[3] = 48 
value_french[3] = 48

私が行った場合

stream_french << "1 000";

value_french[1] の値は 32 です。エラーは char の符号に関連しているようですが、変換を行うときに空白にのみ影響するのはなぜですか?

4

1 に答える 1

7

-96 は 160 に相当する符号付き、つまり 0xA0 です。Windows 1252 のコードページ テーブルを確認すると、そのような文字が

A0 = U+00A0 : NO-BREAK SPACE

これは、自動改行を許可しないスペースです:

通常、テキスト処理ソフトウェアは、スペース文字が発生する場所ならどこにでも自動改行を挿入できると想定しています。非改行スペースは、これが発生するのを防ぎます (もちろん、ソフトウェアが文字を認識している場合)。たとえば、「100 km」というテキストが行末に収まらない場合、ソフトウェアは「100」と「km」の間に改行を挿入することがあります。この望ましくない動作を回避するために、編集者は「100」と「km」の間の改行なしスペースを使用することを選択できます。これにより、テキスト "100 km" が壊れないことが保証されます。行末に収まらない場合は、全体が次の行に移動されます。

「100 km」の場合と同様に、「1 000」の場合も、1 と 3 つの 0 の間に改行があるのは望ましくないことが明らかであるため、改行しないスペースが使用されます。確かにかなり賢い。

明確にするために:「通常の」スペースを使用:

1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 100 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 100 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 100 1,000 1,000 1,000 1,000 1,000

非改行スペースを使用:

1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 100 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 100 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 100 1,000 1,000 1,000 1,000 1,000

(違いが分からない場合は、ブラウザのフォントサイズで拡大・縮小してみてください)

于 2010-10-17T14:18:54.180 に答える