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] 的值是 -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 的符号有关,但为什么在进行转换时它只影响空格?

4

1 回答 1

7

-96 是 160 的有符号等价物,即 0xA0;如果你去检查Windows 1252 代码页表,你会看到这样的字符是

A0 = U+00A0 : 无间断空间

这是一个不允许自动换行的空格

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

与“100 km”一样,“1 000”显然不希望在 1 和三个 0 之间有换行符,因此使用不间断空格;确实很聪明。

明确地说:使用“正常”空间:

1 000100010001000100010001000 1 0001000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000100010001000100010001000 1 0001000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000100010001000100010001000 1 0001000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000

有一个不间断的空间:

1 000100010001000100010001000 1 0001000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000100010001000100010001000 1 0001000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000100010001000100010001000 1 0001000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000

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

于 2010-10-17T14:18:54.180 回答