stringstream和french locale(French_France.1252)

时间:2010-10-17 14:06:05

标签: c++ internationalization locale stringstream

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]的值为-96而不是32,为什么会这样?

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的signedess有关,但为什么它只在转换时影响空格?

1 个答案:

答案 0 :(得分:6)

-96是有符号的等效值160,即0xA0;如果你去查看Windows 1252 codepage table,你会看到这样的角色是

  

A0 = U + 00A0:NO-BREAK SPACE

a space that don't allow an automatic line break

  

文本处理软件通常假定可以在空格字符出现的任何地方插入自动换行符;一个不间断的空间可以防止这种情况发生(当然软件识别出这个角色)。例如,如果文本“100 km”不太适合行的末尾,则软件可以在“100”和“km”之间插入换行符。为了避免这种不良行为,编辑者可以选择使用“100”和“km”之间的非中断空格。这保证了文本“100 km”不会被破坏:如果它不适合一行的末尾,它将完全移动到下一行。

与“100 km”一样,“1 000”也很明显,在1和3之间断线是不可取的,因此使用了不间断的空间;非常聪明。

明确表示:“正常”空间:

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 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 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 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 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

(如果您没有看到任何差异,请尝试使用浏览器的字体大小进行放大/缩小)