Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Windows [игнор отключен] [закрыт для гостей] / Проблемы копирования кирилличного текста при английской раскладке / 19 сообщений из 19, страница 1 из 1
11.09.2009, 09:53
    #36190263
Andriy Tysh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблемы копирования кирилличного текста при английской раскладке
Win2000

Проблема собственно следующая. Когда включена русская раскладка клавиатуры, то кирилличный текст корректно копируется и вставляется в третью программу, коль раскладка аглицкая, то вставляет "крякозябры".
В ветке nls в реестре стоит 1251, как и советуют в сети. Тоесть, с отображением в приложениях всё ОК, а вот с копированием проблемы. Подозрение, что неверно читает из шрифта, но как исправить?

Как такое случилось не понимаю, но до вчерашнего дня всё было хорошо.

Спасибо за ответы.
...
Рейтинг: 0 / 0
11.09.2009, 10:17
    #36190337
Anatoly Podgoretsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблемы копирования кирилличного текста при английской раскладке
Проблема в ANSI
Юникод - Юникод копируется нормально.
Одна или обе программы работают неверно и возможно, что это даже не Юникод программы.
А что за намек на nls - случайно не про хакерские советы?

--
http://www.podgoretsky.com
...
Рейтинг: 0 / 0
11.09.2009, 10:27
    #36190376
Andriy Tysh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблемы копирования кирилличного текста при английской раскладке
Anatoly PodgoretskyОдна или обе программы работают неверно и возможно, что это даже не Юникод программы.
Возможно и некорректно работают приложения, но ведь до позавчера копировалось нормально. Помню была только одна ошибка, связанная со шрифтом, в приложении, когда я редактировал pdf-файл, что-то типа "...шрифт не поддерживается системой...". Но я ноль внимания. А вчера с утра подарочек(((

Anatoly PodgoretskyА что за намек на nls - случайно не про хакерские советы?\
Да нет, стандартная замена значения для c_1252 на 1251, чтобы некоторые приложения корректно кирилличный текст отображали (с фотошопом впервые столкнулся и корпоративной асей).
...
Рейтинг: 0 / 0
11.09.2009, 13:57
    #36191078
Алымов Анатолий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблемы копирования кирилличного текста при английской раскладке
У меня так из оракловых прилаг (oracle builder, forms, pl/sql developer) при копировании русского языка вставляются кракозябры, если раскладка при копировании не на русском
...
Рейтинг: 0 / 0
11.09.2009, 16:51
    #36191673
Andriy Tysh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблемы копирования кирилличного текста при английской раскладке
Спасибо всем сочувствующим за участие... :-)

Не сам сделал, а нашёл в паутине, посему слава ей!
Надо скачать бесплатную утилиту AutoHotKey , создать скрипт:
Код: plaintext
1.
2.
3.
4.
5.
6.
^c::
  DetectHiddenWindows, On
  Text=%Clipboard%
  SendMessage, 0x50,, 0x4190419,, %A_ScriptFullPath%  ; Окно скрипта на русский.
  Clipboard=%Text%
Return
запустить и ВСЁ.

Можно его конвертировать в exe и в авторан.

А что делать, коль никто лучшего не предложил?!
...
Рейтинг: 0 / 0
11.09.2009, 18:33
    #36191886
Andriy Tysh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблемы копирования кирилличного текста при английской раскладке
Протестировал и сделал изменения:
Код: plaintext
1.
2.
3.
4.
5.
6.
OnClipboardChange::
  DetectHiddenWindows, On
  Text=%Clipboard%
  SendMessage, 0x50,, 0x4190419,, %A_ScriptFullPath%  ; Окно скрипта на русский.
  Clipboard=%Text%
Return
Но есть НО: в тех приложениях, в которых корректно копировалось, появились символы ? вместо кирилличных.
Если кто знает, как это победить и видоизменит скрипт, буду признателен.
...
Рейтинг: 0 / 0
11.09.2009, 19:46
    #36191963
Andriy Tysh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблемы копирования кирилличного текста при английской раскладке
Немного подсуетился и вот что нашёл:

А вот собственно и результат, который мою проблему решает на 100%:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
ClipPutText(Text, LocaleID=0x419)
{
  CF_TEXT:= 1 , CF_LOCALE:= 16 , GMEM_MOVEABLE:= 2 
  TextLen   :=StrLen(Text)
  HmemText  :=DllCall("GlobalAlloc", UInt, GMEM_MOVEABLE, UInt, TextLen+ 1 )  ; Запрос перемещаемой
  HmemLocale:=DllCall("GlobalAlloc", UInt, GMEM_MOVEABLE, UInt,  4 )  ; памяти, возвращаются хэндлы.
  If(!HmemText || !HmemLocale)
    Return
  PtrText   :=DllCall("GlobalLock",  UInt, HmemText)   ; Фиксация памяти, хэндлы конвертируются
  PtrLocale :=DllCall("GlobalLock",  UInt, HmemLocale) ; в указатели (адреса).
  DllCall("msvcrt\memcpy", UInt, PtrText, Str, Text, UInt, TextLen+ 1 ) ; Копирование текста.
  NumPut(LocaleID, PtrLocale+ 0 )                 ; Запись идентификатора локали.
  DllCall("GlobalUnlock",     UInt, HmemText)   ; Расфиксация памяти.
  DllCall("GlobalUnlock",     UInt, HmemLocale)
  If not DllCall("OpenClipboard", UInt,  0 )      ; Открытие буфера обмена.
  {
    DllCall("GlobalFree", UInt, HmemText)    ; Освобождение памяти,
    DllCall("GlobalFree", UInt, HmemLocale)  ; если открыть не удалось.
    Return
  }
  DllCall("EmptyClipboard")                     ; Очистка.
  DllCall("SetClipboardData", UInt, CF_TEXT,   UInt, HmemText)   ; Помещение данных.
  DllCall("SetClipboardData", UInt, CF_LOCALE, UInt, HmemLocale)
  DllCall("CloseClipboard")                                      ; Закрытие.
}


ClipGetText(CodePage= 1251 )
{
  CF_TEXT:= 1 , CF_UNICODETEXT:= 13 , Format:= 0 
  If not DllCall("OpenClipboard", UInt,  0 )                 ; Открытие буфера обмена.
    Return
  Loop
  {
    Format:=DllCall("EnumClipboardFormats", UInt, Format)  ; Перебор форматов.
    If(Format= 0  || Format=CF_TEXT || Format=CF_UNICODETEXT)
      Break
  }
  If(Format= 0 )        ; Текста не найдено.
    Return
  If(Format=CF_TEXT)
  {
    HmemText:=DllCall("GetClipboardData", UInt, CF_TEXT)  ; Получение хэндла данных.
    PtrText :=DllCall("GlobalLock",       UInt, HmemText) ; Конвертация хэндла в указатель.
    TextLen :=DllCall("msvcrt\strlen",    UInt, PtrText)  ; Измерение длины найденного текста.
    VarSetCapacity(Text, TextLen+ 1 )  ; Переменная под этот текст.
    DllCall("msvcrt\memcpy", Str, Text, UInt, PtrText, UInt, TextLen+ 1 ) ; Текст в переменную.
    DllCall("GlobalUnlock", UInt, HmemText)  ; Расфиксация памяти.
  }
  Else If(Format=CF_UNICODETEXT)
  {
    HmemTextW:=DllCall("GetClipboardData", UInt, CF_UNICODETEXT)
    PtrTextW :=DllCall("GlobalLock",       UInt, HmemTextW)
    TextLen  :=DllCall("msvcrt\wcslen",    UInt, PtrTextW)
    VarSetCapacity(Text, TextLen+ 1 )
    DllCall("WideCharToMultiByte", UInt, CodePage, UInt,  0 , UInt, PtrTextW 
                                 , Int, TextLen+ 1 , Str, Text, Int, TextLen+ 1 
                                 , UInt,  0 , Int,  0 )  ; Конвертация из Unicode в ANSI.
    DllCall("GlobalUnlock", UInt, HmemTextW)
  }
  DllCall("CloseClipboard")  ; Закрытие.
  Return Text
}

#Persistent
return

OnClipboardChange:
  Text:=ClipGetText( 1251 )   ; альтернатива команде Text=%Clipboard%
  ClipPutText(Text, 0x419)   ; альтернатива команде Clipboard=%Text%
Return

Приятно самому находить решения, но не устаю утверждать, что малый КПД на энтом хворуме, пусть кто мне что не пишет аля "проблема узкая", отвечу за Станиславским: "НЕ ВЕРЮ!".
...
Рейтинг: 0 / 0
11.09.2009, 19:47
    #36191966
Andriy Tysh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблемы копирования кирилличного текста при английской раскладке
Урл не навёл для интересующихся:
http://forum.script-coding.info/viewtopic.php?id=1073
...
Рейтинг: 0 / 0
18.09.2009, 19:04
    #36205154
Andriy Tysh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблемы копирования кирилличного текста при английской раскладке
И уж совсем полноценный работоспособный "костыль". Исправил проблему невозможности копирования любой не текстовой информации (файла к примеру). Надеюсь, кому-то пригодится...
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
ClipPutText(Text, LocaleID=0x419)
{
  CF_TEXT:= 1 , CF_LOCALE:= 16 , GMEM_MOVEABLE:= 2 
  TextLen   :=StrLen(Text)
  HmemText  :=DllCall("GlobalAlloc", UInt, GMEM_MOVEABLE, UInt, TextLen+ 1 )  ; Запрос перемещаемой
  HmemLocale:=DllCall("GlobalAlloc", UInt, GMEM_MOVEABLE, UInt,  4 )  ; памяти, возвращаются хэндлы.
  If(!HmemText || !HmemLocale)
    Return
  PtrText   :=DllCall("GlobalLock",  UInt, HmemText)   ; Фиксация памяти, хэндлы конвертируются
  PtrLocale :=DllCall("GlobalLock",  UInt, HmemLocale) ; в указатели (адреса).
  DllCall("msvcrt\memcpy", UInt, PtrText, Str, Text, UInt, TextLen+ 1 ) ; Копирование текста.
  NumPut(LocaleID, PtrLocale+ 0 )                 ; Запись идентификатора локали.
  DllCall("GlobalUnlock",     UInt, HmemText)   ; Расфиксация памяти.
  DllCall("GlobalUnlock",     UInt, HmemLocale)
  If not DllCall("OpenClipboard", UInt,  0 )      ; Открытие буфера обмена.
  {
    DllCall("GlobalFree", UInt, HmemText)    ; Освобождение памяти,
    DllCall("GlobalFree", UInt, HmemLocale)  ; если открыть не удалось.
    Return
  }
  DllCall("EmptyClipboard")                     ; Очистка.
  DllCall("SetClipboardData", UInt, CF_TEXT,   UInt, HmemText)   ; Помещение данных.
  DllCall("SetClipboardData", UInt, CF_LOCALE, UInt, HmemLocale)
  DllCall("CloseClipboard")                                      ; Закрытие.
}


ClipGetText(CodePage= 1251 )
{
  CF_TEXT:= 1 , CF_UNICODETEXT:= 13 , Format:= 0 
  If not DllCall("OpenClipboard", UInt,  0 )                 ; Открытие буфера обмена.
    Return
  Loop
  {
    Format:=DllCall("EnumClipboardFormats", UInt, Format)  ; Перебор форматов.
    If(Format= 0  || Format=CF_TEXT || Format=CF_UNICODETEXT)
      Break
  }
  If(Format= 0 )        ; Текста не найдено.
  {
    DllCall("CloseClipboard")  ; Закрытие.
    Return
  }  
  If(Format=CF_TEXT)
  {
    HmemText:=DllCall("GetClipboardData", UInt, CF_TEXT)  ; Получение хэндла данных.
    PtrText :=DllCall("GlobalLock",       UInt, HmemText) ; Конвертация хэндла в указатель.
    TextLen :=DllCall("msvcrt\strlen",    UInt, PtrText)  ; Измерение длины найденного текста.
    VarSetCapacity(Text, TextLen+ 1 )  ; Переменная под этот текст.
    DllCall("msvcrt\memcpy", Str, Text, UInt, PtrText, UInt, TextLen+ 1 ) ; Текст в переменную.
    DllCall("GlobalUnlock", UInt, HmemText)  ; Расфиксация памяти.
  }
  Else If(Format=CF_UNICODETEXT)
  {
    HmemTextW:=DllCall("GetClipboardData", UInt, CF_UNICODETEXT)
    PtrTextW :=DllCall("GlobalLock",       UInt, HmemTextW)
    TextLen  :=DllCall("msvcrt\wcslen",    UInt, PtrTextW)
    VarSetCapacity(Text, TextLen+ 1 )
    DllCall("WideCharToMultiByte", UInt, CodePage, UInt,  0 , UInt, PtrTextW 
                                 , Int, TextLen+ 1 , Str, Text, Int, TextLen+ 1 
                                 , UInt,  0 , Int,  0 )  ; Конвертация из Unicode в ANSI.
    DllCall("GlobalUnlock", UInt, HmemTextW)
  }
  DllCall("CloseClipboard")  ; Закрытие.
  Return Text
}

ClipIsTextFormat()
{
  CF_TEXT:= 1 , CF_UNICODETEXT:= 13 , Format:= 0 
  If not DllCall("OpenClipboard", UInt,  0 )                 ; Открытие буфера обмена.
    Return  0 
  Loop
  {
    Format:=DllCall("EnumClipboardFormats", UInt, Format)  ; Перебор форматов.
    If(Format= 0  || Format=CF_TEXT || Format=CF_UNICODETEXT)
      Break
  }
  DllCall("CloseClipboard")  ; Закрытие.
  If(Format= 0 )        ; Текста не найдено.
    Return  0 
  else
    Return  1 
}

#Persistent
return

OnClipboardChange:
  ClipSaved := ClipboardAll
  if ClipIsTextFormat() =  1 
  {  
    Text:=ClipGetText( 1251 )   ; альтернатива команде Text=%Clipboard%
	  ClipPutText(Text, 0x419)   ; альтернатива команде Clipboard=%Text%
  }
  else
    Clipboard := ClipSaved   
  ClipSaved =   
Return
...
Рейтинг: 0 / 0
07.11.2009, 00:19
    #36295991
216135
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблемы копирования кирилличного текста при английской раскладке
Andriy Tysh, привет.
Это Логистичка.
Мои координаты:
evrobaksovichmnogorublishev гав гав rambler.ru
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
23.12.2011, 17:37
    #37591240
Dvm_home
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблемы копирования кирилличного текста при английской раскладке
Andriy Tysh,
Здравствуйте.
Проблема не решена. Попробуйте скопировать цифры.
...
Рейтинг: 0 / 0
30.10.2012, 15:41
    #38018892
Andrey Zay
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблемы копирования кирилличного текста при английской раскладке
Для Win7 64-bit помогла замена файла c:\Windows\System32\C_1252.NLS файлом c:\Windows\System32\C_1251.NLS
...
Рейтинг: 0 / 0
30.10.2012, 16:38
    #38019014
Khod
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблемы копирования кирилличного текста при английской раскладке
Andrey ZayДля Win7 64-bit помогла замена файла c:\Windows\System32\C_1252.NLS файлом c:\Windows\System32\C_1251.NLS

И зачем такие кривые решщения?
...
Рейтинг: 0 / 0
30.10.2012, 16:43
    #38019031
Anatoly Podgoretsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблемы копирования кирилличного текста при английской раскладке
Уже столько лет говорят, что это диверсия, но все равно находятся диверсанты
...
Рейтинг: 0 / 0
30.10.2012, 17:55
    #38019163
bga83
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблемы копирования кирилличного текста при английской раскладке
Anatoly PodgoretskyУже столько лет говорят, что это диверсия, но все равно находятся диверсанты
мне одного раза хватило лет 5 назад, чтобы удостовериться что такой способ не помогает
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
21.05.2014, 12:26
    #38647438
ZeuseZ
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблемы копирования кирилличного текста при английской раскладке
Andrey ZayДля Win7 64-bit помогла замена файла c:\Windows\System32\C_1252.NLS файлом c:\Windows\System32\C_1251.NLS

Подтверждаю. Самый простой и действенный способ.
Win7х64
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
19.05.2016, 19:00
    #39239499
Проблемы копирования кирилличного текста при английской раскладке
Andrey ZayДля Win7 64-bit помогла замена файла c:\Windows\System32\C_1252.NLS файлом c:\Windows\System32\C_1251.NLS
Работает. Замену делал на лежачей винде, файловая система которой была смонтирована в другой операционной системе.
...
Рейтинг: 0 / 0
20.05.2016, 10:26
    #39239772
Roman Mejtes
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблемы копирования кирилличного текста при английской раскладке
тема 2009 года.... Некропостеры )
...
Рейтинг: 0 / 0
20.05.2016, 11:47
    #39239863
Leonid Kudryavtsev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблемы копирования кирилличного текста при английской раскладке
Павел НиктинAndrey ZayДля Win7 64-bit помогла замена файла c:\Windows\System32\C_1252.NLS файлом c:\Windows\System32\C_1251.NLS
Работает. Замену делал на лежачей винде, файловая система которой была смонтирована в другой операционной системе.

Григорий ОстерВРЕДНЫЕ СОВЕТЫ
...
Кто не прыгал из окошка
Вместе с маминым зонтом,
Тот лихим парашютистом
Не считается пока.
Не лететь ему, как птице,
Над взволнованной толпой,
Не лежать ему в больнице
С забинтованной ногой.
...
...
Рейтинг: 0 / 0
Форумы / Windows [игнор отключен] [закрыт для гостей] / Проблемы копирования кирилличного текста при английской раскладке / 19 сообщений из 19, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]