Опять кодировка строки. Windows 7

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
JohnK
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 874
Зарегистрирован: 03.08.2002 (Сб) 0:35
Откуда: 48.02` 37.58`

Re: Опять кодировка строки. Windows 7

Сообщение JohnK » 13.03.2012 (Вт) 22:20

На практике не искажает, только теоретически может. Согласен.
SELECT * FROM girls WHERE tits NOT NULL AND age BETWEEN 18 AND 25 ORDER BY Beauty

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Опять кодировка строки. Windows 7

Сообщение Хакер » 13.03.2012 (Вт) 22:22

Я говорю о тестовой строке «Krϋger — Жақсы сөз!». Ты хочешь сказать, что твои варианты её не искажают?
kruger_jaksi_syoz.png
kruger_jaksi_syoz.png (2.74 Кб) Просмотров: 1065
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

JohnK
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 874
Зарегистрирован: 03.08.2002 (Сб) 0:35
Откуда: 48.02` 37.58`

Re: Опять кодировка строки. Windows 7

Сообщение JohnK » 13.03.2012 (Вт) 22:30

1) Переведи что здесь написано (Krϋger — Жақсы сөз!)
2) При копировании и вставке в оболочку VB уже получается "Kr?ger — Æà?ñû ñ?ç!"
SELECT * FROM girls WHERE tits NOT NULL AND age BETWEEN 18 AND 25 ORDER BY Beauty

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: Опять кодировка строки. Windows 7

Сообщение iGrok » 13.03.2012 (Вт) 22:34

JohnK писал(а):1) Переведи что здесь написано (Krϋger — Жақсы сөз!)
2) При копировании и вставке в оболочку VB уже получается "Kr?ger — Æà?ñû ñ?ç!"

1) Какая разница-то? Фраза - просто пример юникодной строки, в которой используются символы из разных алфавитов. Т.е. строки, которую никаким способом нельзя сконвертировать в ANSI без искажений.
2) А зачем ты строку "копируешь и вставляешь"? Приведён же код, которым эта строка создаётся: e$ = "Kr" + ChrW(&H3CB) + "ger — Жа" + ChrW(&H49B) + "сы с" + ChrW(&H4E9) + "з!", вот его и надо копировать и вставлять.
label:
cli
jmp label

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Опять кодировка строки. Windows 7

Сообщение Хакер » 13.03.2012 (Вт) 22:36

JohnK писал(а):1) Переведи что здесь написано (Krϋger — Жақсы сөз!)

Крюгер (нем. гончар) — хорошее слово!

JohnK писал(а):2) При копировании и вставке в оболочку VB уже получается "Kr?ger — Æà?ñû ñ?ç!"

Получается, ты пропустил мимо глаз то, что в коде уже есть эта строковая константа.
Хорошо, ещё раз для невнимательных:

Вот мой вариант функции SetClipboardDataAPI. Изначально это была твоя функция, но я исправил там пару строчек:
Код: Выделить всё
Public Sub SetClipboardDataAPI(strText As String)
    Dim hMem As Long, lpMem As Long, l As Long
   
    hMem = GlobalAlloc(GMEM_MOVEABLE, LenB(strText) + 2): If hMem = 0 Then Error 7
    lpMem = GlobalLock(hMem): If lpMem = 0 Then Error 7
    RtlMoveMemory ByVal lpMem, ByVal StrPtr(strText), LenB(strText) + 2
    GlobalUnlock hMem
   
    Call OpenClipboard(0&)
    Call EmptyClipboard
    Call SetClipboardData(CF_UNICODETEXT, hMem)
    Call CloseClipboard
End Sub


Вот мой тест. Он сначала выводит строку «Krϋger — Жақсы сөз!» на экран, а потом её же копирует в буфер обмена:
Код: Выделить всё
Private Sub Command1_Click()
    e$ = "Kr" + ChrW(&H3CB) + "ger — Жа" + ChrW(&H49B) + "сы с" + ChrW(&H4E9) + "з!"
    MessageBoxW 0, StrPtr(e$), 0, 0
    SetClipboardDataAPI e$
End Sub


Вот мои объявления API-функций:
Код: Выделить всё
Private Declare Function MessageBoxW Lib "user32" (ByVal h As Long, ByVal g As Long, ByVal j As Long, ByVal n As Long) As Long

Private Declare Sub RtlMoveMemory Lib "kernel32" (dst As Any, src As Any, ByVal amount As Long)

Private Declare Function GlobalAlloc Lib "kernel32" (ByVal wFlags As Long, ByVal dwBytes As Long) As Long
Private Declare Function GlobalLock Lib "kernel32" (ByVal hMem As Long) As Long
Private Declare Function GlobalUnlock Lib "kernel32" (ByVal hMem As Long) As Long
Private Declare Function OpenClipboard Lib "user32" (ByVal hwnd As Long) As Long
Private Declare Function CloseClipboard Lib "user32" () As Long
Private Declare Function SetClipboardData Lib "user32" (ByVal wFormat As Long, ByVal hMem As Long) As Long
Private Declare Function EmptyClipboard Lib "user32" () As Long


Private Const CF_UNICODETEXT = 13
Private Const GMEM_MOVEABLE = &H2


Вот моя претензия: моя функция правильная, потому что копирует тестовую строчку без искажений. Все варианты функции, предложенные тобою — фигня, потому что не смогут скопировать эту строчку в буфер без искажений. Просто подставь в мой тестовый исходник любую из своих функций вместо моей реализации SetClipboardDataAPI.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Опять кодировка строки. Windows 7

Сообщение Хакер » 13.03.2012 (Вт) 22:49

iGrok писал(а):Т.е. строки, которую никаким способом нельзя сконвертировать в ANSI без искажений.

Теоретичеки можно: если изобрести чарсет, в котором будут уживаться и западноевропейские символы и кирилличекие с доп. элементами. Другое дело, что никто не будет заниматься такой глупостью :)
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

JohnK
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 874
Зарегистрирован: 03.08.2002 (Сб) 0:35
Откуда: 48.02` 37.58`

Re: Опять кодировка строки. Windows 7

Сообщение JohnK » 16.03.2012 (Пт) 0:30

Так происходит со всеми неюникодными приложениями. VB6 тут не причём.


По ходу обкатки программы под Windows 7, возник еще один нюанс.
При вставке текста, через буфер обмена из браузера (хром) в Textbox, кириллица становится в виде вопросительных знаков (если выбрана латинская раскладка).

Что в таком случае делать? Сабклассинг?
SELECT * FROM girls WHERE tits NOT NULL AND age BETWEEN 18 AND 25 ORDER BY Beauty

Пред.

Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: AhrefsBot, Google-бот, Yandex-бот и гости: 67

    TopList