===[ Анатомия легендарного глюка ]=== #post-id: 4162-15-20 #original-date: 18.12.2011 Sun #original-time: 3:20 PM #original-day: 4162 #original-host: WinXP Home SP3 (Build 2600) Кстати, пользователи всяких Вист и Нанами! А у вас есть такая проблема, что если текст копировался в одной программе при включенной английской раскладке, то вставляться он будет в другой крякозябами? А то я тут задумала программу на эту тему, которая в фоновом режиме будет фиксить такие неприятности... [Суть легендарной проблемы] Windows поддерживает два формата текста в буфере обмена: CF_TEXT для простого ANSI текста и CF_UNICODETEXT для юникодного текста. Во времена Windows 9x CF_UNICODETEXT не поддерживался на тех системах, и девелоперы привыкли в буфер обмена вставлять только CF_TEXT. Попутно с этим, существует формат CF_LOCALE, который содержит четыре байта и указывает кодовую страницу (локаль) текста в формате CF_TEXT. Не знаю, как Microsoft до этого додумалась, но при вставке в буфер обмена текста в формате CF_TEXT прозрачно (тобишь самой системой) записывается не системная локаль, а локаль текущей выбранной в программе раскладки. При этом установкой CF_UNICODETEXT и CF_LOCALE девелоперы не заморачиваются. Теперь мы вставляем текст на другой стороне, в другой программе. Вот тут и начинается цырк, который зависит от того, куда смотрит программа при забирании текста из буфера обмена. Программа смотрит в CF_TEXT. Тут проблем скорее всего не будет, поскольку ANSI они есть ANSI, и принимающая программа скорее всего будет разбирать его предполагая текущую системную (или установленную для потока) локаль. Хотя даже старые программы могут делать иначе, если полагаются на систему (в каких нибудь очень стандартизированных вещах, которые осуществляют сами контролы вроде TEXT). Программа смотрит в CF_UNICODETEXT. Тут и начинается праздник жизни. Допустим, передающая программа сама указала текст в этом формате. Возможно, дальше всё вставится правильно, но у меня в Агехе бывали непонятные приколы, когда текст не воспринимался правильно. Допустим, передающую программу писал лентяй, и ничего не указал. Принимающая программа запрашивает CF_UNICODETEX, и Windows радостно сообщает, что их есть у неё. Врёт! Дальше программа запрашивает этот самый формат, и умная система создаёт его на месте. Для этого она смотрит какая локаль указана в CF_LOCALE и конвертирует текст из CF_TEXT используя эту локаль. Ну и в итоге результат возвращается программе. Если в передающей программе был скопирован русский текст при включенной английской раскладке, мы получаем крякозябы. Сконвертированный текст сохраняется в буфере обмена, и сделать что-то уже сложнее, хотя и можно. Вот такая история. Я сейчас раздумываю над программой, которая в фоновом режиме будет отслеживать появление текста в буфере обмена и и тут же фиксить CF_LOCALE чтобы та соответствовала системной. Или лучше по хоткею фиксить CF_LOCALE и заново конвертировать CF_TEXT в CF_UNICODETEXT? Вроде как попытался вставить - вставились крякозябы. Нажал хоткей и снова попробовал?