Казахские "умляуты"

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
trash
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 113
Зарегистрирован: 28.01.2009 (Ср) 12:09

Re: Казахские "умляуты"

Сообщение trash » 25.06.2009 (Чт) 16:34

Я все понял и у меня почти все получилось. Объявил все строки As Long и привел EncodeUTF8 в полностью кошерный и рабочий вид:
Код: Выделить всё
Public Function EncodeUTF8(ByVal strSrc As String) As String
Dim nLen As Long
Dim strDst As String
Dim strRet As String
Dim nRet As Long
Dim p As Long
    If Len(strSrc) = 0 Then Exit Function
    nLen = Len(strSrc) * 2
    strDst = String(nLen, vbNullChar)
    strRet = String(nLen, vbNullChar)
    p = StrPtr(strDst)
    nRet = WideCharToMultiByte(65001, 0, StrPtr(strSrc), nLen, p, nLen, ByVal 0, 0)
    nRet = MultiByteToWideChar(0, &H1, p, nLen, StrPtr(strRet), nLen)
    nLen = InStr(strRet, vbNullChar)
    If nLen = 0 Then
        EncodeUTF8 = strRet
    Else
        EncodeUTF8 = Mid$(strRet, 1, nLen - 1)
    End If
End Function
А вот с DecodeUTF8 не получилось
Код: Выделить всё
Public Function DecodeUTF8(ByVal sInput As String) As String
Dim iStrSize As Long, lMaxSize As Long, str1 As String
Dim p As Long
Dim str2 As String
    If Len(sInput) = 0 Then Exit Function
    Debug.Assert Not sInput Like "*[à-ÿ]*"
    lMaxSize = Len(sInput) * 2
    str1 = String$(lMaxSize, vbNullChar)
    str2 = String$(lMaxSize, vbNullChar)
    p = StrPtr(str1)
    iStrSize = MultiByteToWideChar(65001, 0&, StrPtr(sInput), lMaxSize, p, lMaxSize)
    iStrSize = WideCharToMultiByte(0, 0, p, lMaxSize, StrPtr(str2), lMaxSize, ByVal 0, 0)
    iStrSize = InStr(str2, vbNullChar)
    If iStrSize = 0 Then
        DecodeUTF8 = str2
    Else
        DecodeUTF8 = Mid$(str2, 1, iStrSize - 1)
    End If
End Function

На входе: СҺРҢРёРғРңРө
На выходе: С??РёР??Р
Что означает "юникод". Что не так?

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Re: Казахские "умляуты"

Сообщение alibek » 25.06.2009 (Чт) 18:23

Лучше ByRef As Any, это более универсально.
Зачем ты два раза конвертируешь?
В первой функции тебе нужен только WideCharToMultiByte, во второй только MultiByteToWideChar.
Lasciate ogni speranza, voi ch'entrate.

trash
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 113
Зарегистрирован: 28.01.2009 (Ср) 12:09

Re: Казахские "умляуты"

Сообщение trash » 26.06.2009 (Пт) 10:13

Потому что результат первой функции отправляется в html. Не могу же я туда отправить strDst, лажа получится. А точнее набор вопросительных знаков.
А во второй функции без второй конвертации вообще получается    ! Q   !
  !! !
: Z   Q  - ! ! Q   ! Q!!  !        ( !!   !, 6   ! , 2 0 0 6 - 2 0 0 7 )

Нафига мне эта строка, если это должно быть, к примеру, русскоязычное название html-файла?

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Re: Казахские "умляуты"

Сообщение alibek » 26.06.2009 (Пт) 10:16

Как ты выгружаешь в HTML?
Если через открытие на Output и последующим Print, то это неправильно, в этом случае VB вновь будет преобразовывать строку в ANSI. Открывай как Binary и выгружай через Put.
Lasciate ogni speranza, voi ch'entrate.

trash
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 113
Зарегистрирован: 28.01.2009 (Ср) 12:09

Re: Казахские "умляуты"

Сообщение trash » 26.06.2009 (Пт) 10:22

Я составляю из разных кусков html-строку и выгружаю в Response.Write.
Под BinaryWrite столько переделывать >_<

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Re: Казахские "умляуты"

Сообщение alibek » 26.06.2009 (Пт) 10:50

Ты в ADODB.Stream выгружаешь?
Попробуй тогда оставить две функции, но в Write оберни их в StrConv(vbFromUnicode).
Lasciate ogni speranza, voi ch'entrate.

trash
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 113
Зарегистрирован: 28.01.2009 (Ср) 12:09

Re: Казахские "умляуты"

Сообщение trash » 26.06.2009 (Пт) 11:04

ADODB.Stream не используется. Срока составляется конкатенацией, а весь результат отправляется в ASPTypeLibrary.Response.Write.
StrConv пробовал, получается что-то вроде ????п???? ????п???? ????п???? ???? ???? ???? ???? ???? ???? ?.
Последний раз редактировалось trash 26.06.2009 (Пт) 11:22, всего редактировалось 1 раз.

trash
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 113
Зарегистрирован: 28.01.2009 (Ср) 12:09

Re: Казахские "умляуты"

Сообщение trash » 26.06.2009 (Пт) 11:11

Остроумне форуме)

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Re: Казахские "умляуты"

Сообщение Viper » 26.06.2009 (Пт) 11:18

trash писал(а):ADODB.Stream не используется. Срока составляется конкатенацией, а весь результат отправляется в ASPTypeLibrary.Response.Write.
StrConv пробовал, получается что-то вроде ????пЯ идиот! Убейте меня, кто-нибудь!???пЯ идиот! Убейте меня, кто-нибудь!???пЯ идиот! Убейте меня, кто-нибудь!Я идиот! Убейте меня, кто-нибудь!Я идиот! Убейте меня, кто-нибудь!Я идиот! Убейте меня, кто-нибудь!Я идиот! Убейте меня, кто-нибудь!????.
Может действительно прибить? Автозамена плохого н предлагает! :D
Весь мир матрица, а мы в нем потоки байтов!

trash
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 113
Зарегистрирован: 28.01.2009 (Ср) 12:09

Re: Казахские "умляуты"

Сообщение trash » 26.06.2009 (Пт) 11:23

Начни с себя :D

trash
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 113
Зарегистрирован: 28.01.2009 (Ср) 12:09

Re: Казахские "умляуты"

Сообщение trash » 03.07.2009 (Пт) 11:01

alibek писал(а):Юникод, с которым работает VB и MSSQL — это и есть WideChar.
Вызывая API-функцию, в которой аргумент указан ByVal As String, ты его преобразуешь в ANSI, после чего преобразуешь в Unicode, после чего преобразуешь в UTF-8.
Вот на первой стадии у тебя национальные символы скорее всего и теряются.

Добрый день. Хотелось бы все таки разобраться с DecodeUTF8.
Описанная выше цепочка преобразований, я так понял, соответствует ковертации 1251 - UTF. А что происходит в этом случае?
Код: Выделить всё
Public Function DecodeUTF8(ByVal sInput As String) As String
Dim iStrSize As Long, lMaxSize As Long, str1 As String
Dim p As Long
Dim str2 As String
    If Len(sInput) = 0 Then Exit Function
    lMaxSize = Len(sInput)
    str1 = String$(lMaxSize, 0&)
    iStrSize = MultiByteToWideCharA(65001, 0&, sInput, &HFFFF, StrPtr(str1), lMaxSize)
    If iStrSize > 0 Then
        DecodeUTF8 = Left$(str1, iStrSize - 1)
    Else
        DecodeUTF8 = sInput
    End If
End Function
И как добиться аналогичного результата, только без потерь при конвертации в ANSI при использовании MultiByteToWideChar(65001, 0&, StrPtr(sInput), &HFFFF, StrPtr(str1), lMaxSize)?

Пред.

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

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

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

    TopList