|
|
|
| Проблема - никак не могу перевести chr(13) , chr(10)
Текст получается не отформатированным.
пс Зачем это надо.
При отправке писем для одного экзотичного клиента надо переводить.
Нарыл программку. Но ... см.выше. | |
|
| |
|
|
|
| Я, ни в курсе
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
|
| |
|
| |
|
|
|
| http://excelvba.ru/code/Encode | |
|
| |
|
|
|
| спасибо. попробую
http://excelvba.ru/code/Encode вроде то что нужно, но не переводит. Или переводит?
Че-т я запутался. | |
|
| |
|
|
|
| C файлами понятно.
Мне в коде надо me.body перевести.
Не писать же в файл и обратно? | |
|
| |
|
|
|
|
|
|
| Chr$(13)?
vbCrLf?
+info
http://am.rusimport.ru/MSAccess/topic.aspx?id=692 | |
|
| |
|
|
|
| Спасибо. Но это для файлов. | |
|
| |
|
|
|
| с этим vbCrLf тоже не работает?
а... семён семёныч.. в боди? напиши \n
Cодержать символов перевода строки или возврата каретки ("\n" и "\r")
|
| |
|
| |
|
|
|
|
...
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:
!
|
| |
|
| |
|
|
|
|
|
| еще мулька
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
Переводит хорошо, но теряет переводы строк. | |
|
| |
|
|
|
| я настаиваю на \n в теле письма
не знаю даже, почему | |
|
| |
|
|
|
| m.strBody = Nz(rst![Email_sod] & "\n", "") ? | |
|
| |
|
|
|
| ну типа в письма запихивать - это управляющие символы | |
|
| |
|
|
|
| Не переводит русские буквы!!!!! | |
|
| |
|
|
|
| Вот нарыл, попробуйте
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
|
| |
|
| |
|
|
|
| Спасибо. Пробую. Это уже 5=-й вариант... | |
|
| |
|
|
|
| я уже забыл в чём проблема | |
|
| |
|
|
|
| В отладчике
Before: Dear
Ivan!
Уважаемый
Иван Иваныч!
After Dear
Ivan!
Уважаемый
Р˜РІР°РЅ Р˜РІР°РЅС‹С‡!
В полученном письме:
Dear Ivan! Уважаемый �ван �ваныч!
ps "\n" - воспринимает как симовлы \n
pps код от ДрЮни - тот же эффект | |
|
| |
|
|
|
| когда письмо шлёшь - правильный MIME-TYPE ставишь? :)) Codepage
просто найди инфу по тому - каким должен быть правильный заголовок письма
соответствующей кодировки... | |
|
| |
|
|
|
| m.strContentType = "text/plain; charset=utf-8" | |
|
| |
|
|
|
|
| ды да. вот его никак не вставлю
Решил мать ее.
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
| | |
|
| |
|
|
|
| оооооооооо - класс!! | |
|
| |
|
|
|
| Решил дальше поэкспериментировать.
Теперь работает со всеми предложенными функциями кроме strem - Function ChangeCharset(FileChng As String)
она не понимает русских букофф
ВСЕМ СПАСИБО! | |
|
| |
|
|