Струнный поток и французский язык (French_France.1252) - PullRequest
1 голос
/ 17 октября 2010
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, но почему она влияет только на пробелы при выполнении преобразований?

1 Ответ

6 голосов
/ 17 октября 2010

То, что -96 является знаковым эквивалентом 160, то есть 0xA0;если вы пойдете и посмотрите таблицу кодовых страниц Windows 1252 , вы увидите, что такой символ

A0 = U + 00A0: пробел без разрывов

, то есть пробел, который не допускает автоматического переноса строки :

Программное обеспечение для обработки текста обычно предполагает, что автоматический разрыв строки может быть вставлен в любом месте пробелапроисходит;неразрывный пробел предотвращает это (при условии, что программное обеспечение распознает символ, конечно).Например, если текст «100 км» не совсем умещается в конце строки, программное обеспечение может вставить разрыв строки между «100» и «км».Чтобы избежать этого нежелательного поведения, редактор может использовать неразрывный пробел между «100» и «км».Это гарантирует, что текст «100 км» не будет разбит: если он не помещается в конце строки, он полностью перемещается на следующую строку.

Как и в случае «100 км»", также с" 1 000 "ясно, что не желательно иметь разрыв строки между 1 и тремя 0, поэтому используется неразрывный пробел;действительно очень умный.

Чтобы сделать это определенно ясно: с "нормальным" пробелом:

1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000

с неразрывнымпробел:

1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 0001 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 0001 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 0001 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000 1 000

(если вы не видитеразница, попробуйте увеличить / уменьшить масштаб шрифта браузера)

...