stringstream和french locale(French_France.1252)

ann*_*nno 2 c++ locale stringstream internationalization

std::stringstream stream_french;
stream_french.imbue(std::locale("")); // French_France.1252
stream_french << 1000;
std::string value_french = stream_french.str();
Run Code Online (Sandbox Code Playgroud)

此代码将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
Run Code Online (Sandbox Code Playgroud)

如果我做

stream_french << "1 000";
Run Code Online (Sandbox Code Playgroud)

value_french [1]的值是32.该错误似乎与char的signedess有关,但为什么在进行转换时它只影响空格?

Mat*_*lia 7

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

A0 = U + 00A0:NO-BREAK SPACE

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

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

与"100公里"一样,也是"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

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