Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > VB6 > [vbs] перекодировка


Автор: iff 5.3.2013, 19:55
Код

Function StrConvert(strText, strSourceCharset, strDestCharset)
    Const adTypeText = 2
    Const adModeReadWrite = 3
    
    Dim objStream
    
    Set objStream = CreateObject("ADODB.Stream")
    
    With objStream
        .Type = adTypeText
        .Mode = adModeReadWrite
        
        .Open
        .Charset = strSourceCharset
        .WriteText strText
        .Position = 0
        .Charset = strDestCharset
        strConvert = .ReadText
    End With
    
    Set objStream = Nothing
End Function

Почему-то не работает с utf-8:
Код

s = StrConvert("Слово", "windows-1251", "utf-8")

Автор: Akina 5.3.2013, 20:14
Проверьте, что у Вас в HKEY_CLASSES_ROOT\MIME\Database\Charset\utf-8

Автор: iff 6.3.2013, 00:11
Там 2 записи:
Codepage REG_DWORD 0x000004b0 (1200)
InternetEncoding REG_DWORD 0x0000fde9 (65001)
Но что они означают не нашел в инете

Автор: FallFan 6.3.2013, 00:38
Нашел в одном из скрипте функцию (не моя, но уже не вспомню где взял), может поможет:

Код

Enum CHARSET
  CS_DOS = 866
  CS_Windows = 1251
  CS_ISO = 28595
  CS_KOI8R = 20866
  CS_UTF7 = 65000
  CS_UTF8 = 65001
End Enum

Declare Function MultiByteToWideChar Lib "kernel32" _
        (ByVal CodePage As Long, _
         ByVal dwFlags As Long, _
         ByVal lpMultiByteStr As String, _
         ByVal cchMultiByte As Long, _
         ByVal lpWideCharStr As String, _
         ByVal cchWideChar As Long) _
         As Long
         
Declare Function WideCharToMultiByte Lib "kernel32" _
        (ByVal CodePage As Long, _
         ByVal dwFlags As Long, _
         ByVal lpWideCharStr As String, _
         ByVal cchWideChar As Long, _
         ByVal lpMultiByteStr As String, _
         ByVal cchMultiByte As Long, ByVal _
         lpDefaultChar As String, _
         ByVal lpUsedDefaultChar As Long) _
         As Long

Function ConvertCharset(ByVal strString As String, ByVal FromCharset As CHARSET, ByVal ToCharset As CHARSET) As String
  Dim lngLength As Long
  Dim strWideChar As String
  Dim strReturn As String
  Dim lngReturnLength As Long
  Dim dwFlags As Long
   
  If FromCharset = CS_UTF7 Or FromCharset = CS_UTF8 Then
    dwFlags = 0
  Else
    dwFlags = MB_PRECOMPOSED
  End If
   
  lngLength = Len(strString)
  strWideChar = String$(lngLength * 2, Chr$(0))
  strReturn = String$(lngLength * 2, Chr$(0))
  lngReturnLength = MultiByteToWideChar(FromCharset, dwFlags, strString, lngLength, strWideChar, lngLength)
  WideCharToMultiByte ToCharset, 0, strWideChar, lngReturnLength, strReturn, lngLength * 2, ByVal 0, 0
  ConvertCharset = Left$(strReturn, lngReturnLength)
End Function

Автор: iff 6.3.2013, 16:13
Спасибо за ответы. Впринципе можно самим написать функцию преобразования. В сети видел код на PHP для замены iconv. Переписал для vbs.
Но почему-то в vbs некорректно работают asc и chr
Например asc всегда возвращает код символа знака вопроса, если в качестве аргумента передать кириллическую букву. а chr как будто работает в кодировки cp1252 (если выводить результат в msgbox)

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)