Страница: 1 |
Страница: 1 |
Вопрос: UTF-8
Добавлено: 02.01.08 23:52
Автор вопроса: Winand | Web-сайт:
Как конвертировать текст в сабж на VB6 и обратно?
И во что конвертирует функа StrConv (флаг vbUnicode)?
Ответы
Всего ответов: 6
Номер ответа: 1
Автор ответа:
Sharp
Лидер форума
ICQ: 216865379
Вопросов: 106
Ответов: 9979
Web-сайт:
Профиль | | #1
Добавлено: 03.01.08 02:38
int main(){
wchar_t *s = L"Привет";
char buf[128];
WideCharToMultiByte(CP_UTF8, 0, s, -1, buf, 128, NULL, NULL);
return 0;
}
В UTF-16
Номер ответа: 2
Автор ответа:
Winand
Вопросов: 87
Ответов: 2795
Web-сайт:
Профиль | | #2
Добавлено: 03.01.08 03:27
Несмотря на то, что это явно Си, а не VB6, и несмотря на то, что utf-16, а не utf-8 (хотя не ясно почему 16, написано же CP_UTF8) все равно спс
На самом деле я уже узнал. Всё немножко сложнее (не намного).
Private Const CP_UTF8 = 65001
Private Const CP_ACP = 0
Private Declare Function GetACP Lib "Kernel32" () As Long
Private Declare Function WideCharToMultiByte Lib "Kernel32" (ByVal CodePage As Long, ByVal dwFlags As Long, ByVal lpWideCharStr As Long, ByVal cchWideChar As Long, ByVal lpMultiByteStr As Long, ByVal cchMultiByte As Long, ByVal lpDefaultChar As Long, lpUsedDefaultChar As Long) As Long
Private Declare Function MultiByteToWideChar Lib "Kernel32" (ByVal CodePage As Long, ByVal dwFlags As Long, ByVal lpMultiByteStr As Long, ByVal cchMultiByte As Long, ByVal lpWideCharStr As Long, ByVal cchWideChar As Long) As Long
Private Function WToA(ByVal st As String, Optional ByVal cpg As Long = -1, Optional lFlags As Long = 0) As String
Dim stBuffer As String
Dim cwch As Long
Dim pwz As Long
Dim pwzBuffer As Long
Dim lpUsedDefaultChar As Long
If cpg = -1 Then cpg = GetACP()
pwz = StrPtr(st)
cwch = WideCharToMultiByte(cpg, lFlags, pwz, -1, 0&, 0&, ByVal 0&, ByVal 0&
stBuffer = String$(cwch + 1, vbNullChar)
pwzBuffer = StrPtr(stBuffer)
cwch = WideCharToMultiByte(cpg, lFlags, pwz, -1, pwzBuffer, Len(stBuffer), ByVal 0&, ByVal 0&
WToA = Left$(stBuffer, cwch - 1)
End Function
Private Function AToW(ByVal st As String, Optional ByVal cpg As Long = -1, Optional lFlags As Long = 0) As String
Dim stBuffer As String
Dim cwch As Long
Dim pwz As Long
Dim pwzBuffer As Long
If cpg = -1 Then cpg = GetACP()
pwz = StrPtr(st)
cwch = MultiByteToWideChar(cpg, lFlags, pwz, -1, 0&, 0&
stBuffer = String$(cwch + 1, vbNullChar)
pwzBuffer = StrPtr(stBuffer)
cwch = MultiByteToWideChar(cpg, lFlags, pwz, -1, pwzBuffer, Len(stBuffer))
AToW = Left$(stBuffer, cwch - 1)
End Function
Public Function EncodeUTF8(ByVal cnvUni As String) As String
If cnvUni = vbNullString Then Exit Function
EncodeUTF8 = StrConv(WToA(cnvUni, CP_UTF8), vbUnicode)
End Function
Public Function DecodeUTF8(ByVal cnvUni As String) As String
If cnvUni = vbNullString Then Exit Function
 ecodeUTF8 = AToW(WToA(cnvUni, CP_ACP), CP_UTF8)
End Function
Номер ответа: 3
Автор ответа:
Winand
Вопросов: 87
Ответов: 2795
Web-сайт:
Профиль | | #3
Добавлено: 03.01.08 04:26
Спааааать!!! Долго мучился непонимая почему работает не так как надо. Потом обнаружил, что в конце сохраненного файла куча нулевых символов.
Несмотря на всё уважение к автору кода
http://www.Planet-Source-Code.com/vb/scripts/ShowCode.asp?txtCodeId=44569&lngWId=1
Вношу исправление (и иду спааать):
If cnvUni = vbNullString Then Exit Function
Dim cnvAns As String
cnvAns = WToA(cnvUni, CP_UTF8)
EncodeUTF8 = Mid(StrConv(cnvAns, vbUnicode), 1, Len(cnvAns))
End Function
Номер ответа: 4
Автор ответа:
Sharp
Лидер форума
ICQ: 216865379
Вопросов: 106
Ответов: 9979
Web-сайт:
Профиль | | #4
Добавлено: 03.01.08 12:39
Ты не понял моего ответа. Код переводит из виндового юникода (который ниже указан, как ответ на твой второй вопрос, UTF-16, и который используется внутре vb6) в UTF-8.
Номер ответа: 5
Автор ответа:
Winand
Вопросов: 87
Ответов: 2795
Web-сайт:
Профиль | | #5
Добавлено: 03.01.08 16:51
Разве для символов с кодами от 0000 до FFFF UTF-8 и UTF-16 не совпадают? С чем то там UTF-16 совпадает в этом диапазоне)) Но судя по всему не с восьмеркой..
Номер ответа: 6
Автор ответа:
Sharp
Лидер форума
ICQ: 216865379
Вопросов: 106
Ответов: 9979
Web-сайт:
Профиль | | #6
Добавлено: 04.01.08 08:16
Для символов из cp1251 точно не совпадают