powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Windows [игнор отключен] [закрыт для гостей] / Проблемы копирования кирилличного текста при английской раскладке
19 сообщений из 19, страница 1 из 1
Проблемы копирования кирилличного текста при английской раскладке
    #36190263
Фотография Andriy Tysh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Win2000

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

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

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

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

Anatoly PodgoretskyА что за намек на nls - случайно не про хакерские советы?\
Да нет, стандартная замена значения для c_1252 на 1251, чтобы некоторые приложения корректно кирилличный текст отображали (с фотошопом впервые столкнулся и корпоративной асей).
...
Рейтинг: 0 / 0
Проблемы копирования кирилличного текста при английской раскладке
    #36191078
Алымов Анатолий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У меня так из оракловых прилаг (oracle builder, forms, pl/sql developer) при копировании русского языка вставляются кракозябры, если раскладка при копировании не на русском
...
Рейтинг: 0 / 0
Проблемы копирования кирилличного текста при английской раскладке
    #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
Проблемы копирования кирилличного текста при английской раскладке
    #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
Проблемы копирования кирилличного текста при английской раскладке
    #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
Проблемы копирования кирилличного текста при английской раскладке
    #36191966
Фотография Andriy Tysh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Урл не навёл для интересующихся:
http://forum.script-coding.info/viewtopic.php?id=1073
...
Рейтинг: 0 / 0
Проблемы копирования кирилличного текста при английской раскладке
    #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
Проблемы копирования кирилличного текста при английской раскладке
    #36295991
216135
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Andriy Tysh, привет.
Это Логистичка.
Мои координаты:
evrobaksovichmnogorublishev гав гав rambler.ru
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Проблемы копирования кирилличного текста при английской раскладке
    #37591240
Dvm_home
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Andriy Tysh,
Здравствуйте.
Проблема не решена. Попробуйте скопировать цифры.
...
Рейтинг: 0 / 0
Проблемы копирования кирилличного текста при английской раскладке
    #38018892
Andrey Zay
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Для Win7 64-bit помогла замена файла c:\Windows\System32\C_1252.NLS файлом c:\Windows\System32\C_1251.NLS
...
Рейтинг: 0 / 0
Проблемы копирования кирилличного текста при английской раскладке
    #38019014
Khod
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Andrey ZayДля Win7 64-bit помогла замена файла c:\Windows\System32\C_1252.NLS файлом c:\Windows\System32\C_1251.NLS

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

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

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


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