Rambler's Top100
Форум: MS ACCESSVBVBA MS OfficeMS SQL server
Новые сообщения: 0000

Форум: MS ACCESS

Вопросы связанные с MS ACCESS

Обновить визитку
Участники «Online»
Все участники

 
 

Доброго времени суток, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Кто переводил 1251 в utf-8
 
 автор: Дядя Федор   (05.04.2012 в 10:58)   личное сообщение
 
 

Проблема - никак не могу перевести chr(13) , chr(10)
Текст получается не отформатированным.

пс Зачем это надо.
При отправке писем для одного экзотичного клиента надо переводить.
Нарыл программку. Но ... см.выше.

  Ответить  
 
 автор: час   (05.04.2012 в 11:00)   личное сообщение
 
 

Я, ни в курсе
http://nemcd.com/2010/03/kak-perekodirovat-1251-v-utf-8/
или

Function ChangeCharset(FileChng As String)

    Dim adoStream    As adodb.Stream

    Dim adoStreamOut As adodb.Stream

    Set adoStream = New adodb.Stream
    
    With adoStream
        .Charset = "Windows-1251"
        .open
        .LoadFromFile FileChng
        .Position = 0
    End With
    
    Set adoStreamOut = New adodb.Stream
    
    With adoStreamOut
        .Charset = "UTF-8"
        .open
        .WriteText adoStream.ReadText
        .SaveToFile FileChng, adSaveCreateOverWrite
        .Close '
    End With

adoStream.Close
 Set adoStream = Nothing
Set adoStreamOut = Nothing
End Function

  Ответить  
 
 автор: час   (05.04.2012 в 11:07)   личное сообщение
 
 

http://excelvba.ru/code/Encode

  Ответить  
 
 автор: Дядя Федор   (05.04.2012 в 11:09)   личное сообщение
 
 

спасибо. попробую



http://excelvba.ru/code/Encode вроде то что нужно, но не переводит. Или переводит?
Че-т я запутался.

  Ответить  
 
 автор: Дядя Федор   (05.04.2012 в 11:08)   личное сообщение
 
 

C файлами понятно.
Мне в коде надо me.body перевести.
Не писать же в файл и обратно?

  Ответить  
 
 автор: час   (05.04.2012 в 11:19)   личное сообщение
 
 

аааааааааа

  Ответить  
 
 автор: silich   (05.04.2012 в 11:16)   личное сообщение
 
 

chrw?

  Ответить  
 
 автор: Дядя Федор   (05.04.2012 в 12:04)   личное сообщение
 
 

нет

  Ответить  
 
 автор: silich   (05.04.2012 в 12:17)   личное сообщение
 
 

Chr$(13)?
vbCrLf?

+info
http://am.rusimport.ru/MSAccess/topic.aspx?id=692

  Ответить  
 
 автор: Дядя Федор   (05.04.2012 в 12:39)   личное сообщение
 
 

Спасибо. Но это для файлов.

  Ответить  
 
 автор: silich   (05.04.2012 в 12:41)   личное сообщение
 
 

с этим vbCrLf тоже не работает?
а... семён семёныч.. в боди? напиши \n


Cодержать символов перевода строки или возврата каретки ("\n" и "\r")

  Ответить  
 
 автор: Дядя Федор   (05.04.2012 в 12:49)   личное сообщение
 
 


...
Dim ns$, ss$
Dim m As Message
...
m.strBody = Nz(rst![Email_sod], "")

Debug.Print "Before: ", m.strBody
ss = m.strBody
ns = ChangeTextCharset(ss, "UTF-8", "Windows-1251")
m.strBody = ns
Debug.Print "After: ", m.strBody
...

Function ChangeTextCharset(ByVal txt$, ByVal DestCharset$, _
                           Optional ByVal SourceCharset$) As String
    ' функция перекодировки (смены кодировки) текстовоq строки
   ' В качестве параметров функция получает текстовую строку txt$,
   ' и название кодировки DestCharset$ (в которую будет переведён текст)
   ' Функция возвращает текст в новой кодировке
   On Error Resume Next: Err.Clear
    With CreateObject("ADODB.Stream")
        .Type = 2: .Mode = 3
        If Len(SourceCharset$) Then .Charset = SourceCharset$    ' указываем исходную кодировку
        .Open
        .WriteText txt$
        .Position = 0
        .Charset = DestCharset$    ' назначаем новую кодировку
       ChangeTextCharset = .ReadText
        .Close
    End With
End Function
=============
В окне debug видим
Before:       Уважаемый 
Иван Иваныч!
After:  
  !

  Ответить  
 
 автор: silich   (05.04.2012 в 12:53)   личное сообщение
 
 

\n

  Ответить  
 
 автор: Дядя Федор   (05.04.2012 в 12:53)   личное сообщение
 
 

????????????

  Ответить  
 
 автор: Дядя Федор   (05.04.2012 в 12:55)   личное сообщение
 
 

еще мулька
Function EncodeUTF8(S)
Dim I, c, utfc, b1, b2, b3

For I = 1 To Len(S)
c = ToLong(AscW(Mid(S, I, 1)))
Debug.Print I, Mid(S, I, 1), "c=" & c
If c < 128 Then
If (c = 13) Or (c = 10) Then
utfc = ChrW(c)
Else
utfc = Chr(c)
End If
ElseIf c < 2048 Then
b1 = c Mod &H40
b2 = (c - b1) / &H40
utfc = Chr(&HC0 + b2) & Chr(&H80 + b1)
ElseIf c < 65536 And (c < 55296 Or c > 57343) Then
b1 = c Mod &H40
b2 = ((c - b1) / &H40) Mod &H40
b3 = (c - b1 - (&H40 * b2)) / &H1000
utfc = Chr(&HE0 + b3) & Chr(&H80 + b2) & Chr(&H80 + b1)
Else
' Младший или старший суррогат UTF-16
utfc = Chr(&HEF) & Chr(&HBF) & Chr(&HBD)
End If

EncodeUTF8 = EncodeUTF8 + utfc
Debug.Print "utf=" & utfc
Next
End Function

Переводит хорошо, но теряет переводы строк.

  Ответить  
 
 автор: silich   (05.04.2012 в 12:57)   личное сообщение
 
 

я настаиваю на \n в теле письма
не знаю даже, почему

  Ответить  
 
 автор: Дядя Федор   (05.04.2012 в 13:04)   личное сообщение
 
 

m.strBody = Nz(rst![Email_sod] & "\n", "") ?

  Ответить  
 
 автор: silich   (05.04.2012 в 14:21)   личное сообщение
 
 

ну типа в письма запихивать - это управляющие символы

  Ответить  
 
 автор: Дядя Федор   (05.04.2012 в 13:03)   личное сообщение
 
 

Не переводит русские буквы!!!!!

  Ответить  
 
 автор: ДрЮня   (05.04.2012 в 13:28)   личное сообщение
 
 

Вот нарыл, попробуйте


Option Explicit
Private Const rFrom As Long = 11
Private Const CP_ACP As Long = 0            'default to ANSI code page
Private Const CP_OEMCP As Long = 1          'default to OEM  code page
Private Const CP_MACCP As Long = 2          'default to MAC  code page
Private Const CP_THREAD_ACP As Long = 3     'current thread's ANSI code page
Private Const CP_SYMBOL As Long = 42        'SYMBOL translations
Private Const CP_UTF7 As Long = 65000       'UTF-7 translation
Private Const CP_UTF8 As Long = 65001       'UTF-8 translation

Public Declare Function MultiByteToWideChar& Lib "kernel32" (ByVal CodePage As Long, _
            ByVal dwFlags As Long, ByVal lpMultiByteStr As String, ByVal cchMultiByte As Long, _
            ByRef buff As Byte, ByVal cchWideChar As Long)

Public Declare Function WideCharToMultiByte& Lib "kernel32" (ByVal CodePage As Long, _
            ByVal dwFlags As Long, ByRef buff As Byte, ByVal cchWideChar As Long, _
            ByRef buffCoded As Byte, ByVal cchMultiByte As Long, ByVal lpDefaultChar As String, _
            ByVal lpUsedDefaultChar As Long)


Public Function cpCODE(sCodePage As String, sANSI As String) As String
Dim s As String, bb(1023) As Byte, bbCod(1023) As Byte, lngBadSymbols As Long, res As Long, _
    lngBuffSize As Long, lngCP As Long

    On Error GoTo L_Err
    
    If sANSI = "" Then cpCODE = "": Exit Function
    Select Case sCodePage
        Case "CP_ACP": lngCP = 0
        Case "CP_OEMCP": lngCP = 1              'default to OEM  code page"
        Case "CP_MACCP": lngCP = 2              'default to MAC  code page"
        Case "CP_THREAD_ACP": lngCP = 3         'current thread's ANSI code page"
        Case "CP_SYMBOL": lngCP = 42            'SYMBOL translations"
        Case "CP_UTF7": lngCP = 65000           'UTF-7 translation"
        Case "CP_UTF8": lngCP = 65001           'UTF-8 translation"
        Case Else
            cpCODE = "Set Code Page not define"
            Exit Function
    End Select
    
    'преобразуем ascii строчку в unicode
        res = MultiByteToWideChar(CP_ACP, 0, sANSI, -1, bb(0), 512)
        If res = 0 Then
            cpCODE = "Function 'MultiByteToWideChar' return ERROR"
            Exit Function
        End If
        
    'определяем размер выходного буфера
        lngBuffSize = WideCharToMultiByte(lngCP, 0, bb(0), -1, bbCod(0), 0, vbNullString, lngBadSymbols)
    
    'конвертируем данные входного буфера в заданную кодовую страницу и помещаем в выходной буфер
        res = WideCharToMultiByte(lngCP, 0, bb(0), -1, bbCod(0), lngBuffSize, vbNullString, lngBadSymbols)
        
    'преобразуем выходной буфер в строку в заданной кодовой странице
        Call BinToStr(bbCod(), 0, lngBuffSize - 1, cpCODE)
    
L_Exit: Exit Function
L_Err: cpCODE = Err.Description & " (" & Err.Number & ")": GoTo L_Exit
End Function

Private Sub BinToStr(bb() As Byte, off As Long, num As Long, str As String)
Dim lng As Long

  For lng = off To off + num - 1
      str = str + Chr(bb(lng))
  Next lng
End Sub

  Ответить  
 
 автор: Дядя Федор   (05.04.2012 в 14:14)   личное сообщение
 
 

Спасибо. Пробую. Это уже 5=-й вариант...

  Ответить  
 
 автор: silich   (05.04.2012 в 14:20)   личное сообщение
 
 

я уже забыл в чём проблема

  Ответить  
 
 автор: Дядя Федор   (05.04.2012 в 14:28)   личное сообщение
 
 

В отладчике
Before: Dear
Ivan!

Уважаемый
Иван Иваныч!
After Dear
Ivan!

Уважаемый
Р&#152;ван Р&#152;ваныч!



В полученном письме:

Dear Ivan! Уважаемый Р&#65533;ван Р&#65533;ваныч!

ps "\n" - воспринимает как симовлы \n
pps код от ДрЮни - тот же эффект

  Ответить  
 
 автор: silich   (05.04.2012 в 14:42)   личное сообщение
 
 

когда письмо шлёшь - правильный MIME-TYPE ставишь? :)) Codepage
просто найди инфу по тому - каким должен быть правильный заголовок письма
соответствующей кодировки...

  Ответить  
 
 автор: Дядя Федор   (05.04.2012 в 14:44)   личное сообщение
 
 

m.strContentType = "text/plain; charset=utf-8"

  Ответить  
 
 автор: час   (05.04.2012 в 14:29)   личное сообщение
 
 

перевод строки

  Ответить  
 
 автор: Дядя Федор   (05.04.2012 в 14:38)   личное сообщение
 
 

ды да. вот его никак не вставлю
Решил мать ее.


                                    If InStr(m.strBody, vbCrLf) > 0 Then
                                       vmas = Split(m.strBody, vbCrLf)
                                    End If
                                    m.strBody = ""
                                    For Each v In vmas
                                    m.strBody = m.strBody & EncodeUTF8(v) & vbCrLf  
                                    Next

  Ответить  
 
 автор: час   (05.04.2012 в 15:01)   личное сообщение
 
 

оооооооооо - класс!!

  Ответить  
 
 автор: Дядя Федор   (05.04.2012 в 15:09)   личное сообщение
 
 

Решил дальше поэкспериментировать.
Теперь работает со всеми предложенными функциями кроме strem - Function ChangeCharset(FileChng As String)
она не понимает русских букофф


ВСЕМ СПАСИБО!

  Ответить  
 
 автор: час   (05.04.2012 в 23:12)   личное сообщение
 
 

силычу - спасибо!

  Ответить  
 
 автор: silich   (06.04.2012 в 08:50)   личное сообщение
 
 

  Ответить  
HiProg.com - Технологии программирования
Rambler's Top100 TopList