Страница: 1 |
|
Вопрос: UTF-8 -> ANSI
|
Добавлено: 09.01.09 00:03
|
|
Автор вопроса: Lapex
|
С прошедшими праздничками!
Что-то не выходит конвертировать строку из UTF-8 в ANSI кодировку :(.
Насколько я понял UTF-8 строка может быть, как ANSI так и Unicode. Т.к. мне нужно конвертировать текст(UTF-8) из текстового файла, то считаю, что у меня UTF-8 представлена, как ANSI.
Следующий код позаимствован у Josй Roca:
http://www.forum.it-berater.org/index.php?topic=157.0;prev_next=prev
#COMPILE EXE
#DIM ALL
#INCLUDE "Win32API.inc"
FUNCTION WideCharToUTF8 (BYVAL pWideStr AS DWORD) AS STRING
LOCAL hr AS LONG
LOCAL l AS LONG
LOCAL Buffer AS STRING
l = lstrlenW (BYVAL pWideStr)
hr = WideCharToMultiByte (%CP_UTF8, %NULL, BYVAL pWideStr, l, _
BYVAL %NULL, 0, BYVAL %NULL, BYVAL %NULL)
IF hr = 0 THEN EXIT FUNCTION
Buffer = SPACE$(hr)
hr = WideCharToMultiByte (%CP_UTF8, %NULL, BYVAL pWideStr, l, _
BYVAL STRPTR(Buffer), LEN(Buffer), BYVAL %NULL, BYVAL %NULL)
IF hr = 0 THEN EXIT FUNCTION
FUNCTION = Buffer
END FUNCTION
'==========================================================================
FUNCTION PBMAIN () AS LONG
DIM strAnsiString AS STRING
DIM strUTF8WidecharString AS STRING
DIM strUTF8AnsiString AS STRING
strAnsiString = "Р_С_Р_Р+Р°" ' ANSI строка в UTF-8 кодировке ("Проба")
' Конвертируем из Ansi в Unicode
strAnsiString = UCODE$(strAnsiString)
' Конвертируем из Unicode в UTF8 Unicode строку
strUTF8WidecharString = WideCharToUTF8(STRPTR(strAnsiString))
' Конвертируем из UTF8 Unicode в Ansi
strUTF8AnsiString = ACODE$(strUTF8WidecharString)
MSGBOX strUTF8AnsiString
END FUNCTION
Почему-то результат: "????????", вместо "Проба"?
Ответить
|
Номер ответа: 3 Автор ответа: Kalte
Вопросов: 1 Ответов: 11
|
Профиль | | #3
|
Добавлено: 09.01.09 17:37
|
UCODE$(str, 866)
Ответить
|
Номер ответа: 4 Автор ответа: Kalte
Вопросов: 1 Ответов: 11
|
Профиль | | #4
|
Добавлено: 09.01.09 17:47
|
ээ не то...
вот это
-
- FUNCTION AsciiToUtf8 (BYVAL strAscii AS STRING) AS STRING
-
- LOCAL i AS LONG
- LOCAL strUtf8 AS STRING
- LOCAL idx AS LONG
- LOCAL c AS LONG
- LOCAL b2 AS LONG
-
- IF LEN(strAscii) = 0 THEN EXIT FUNCTION
-
-
-
-
-
- strUtf8 = SPACE$(LEN(strAscii) * 2)
-
-
-
- idx = 1
-
-
- FOR i = 1 TO LEN(strAscii)
-
- c = ASC(MID$(strAscii, i, 1))
-
- IF c < 128 THEN
-
- MID$(strUtf8, idx, 1) = MID$(strAscii, idx, 1)
-
- idx = idx + 1
- ELSE
-
-
-
-
- b2 = (c AND &H3F) OR &H80
-
-
- SHIFT RIGHT c, 6
- c = c OR &HC0
-
- MID$(strUtf8, idx, 2) = CHR$(c, b2)
- idx = idx + 2
- END IF
- NEXT
-
-
- FUNCTION = LEFT$(strUtf8, idx - 1)
-
- END FUNCTION
и это
-
- FUNCTION Utf8ToAscii (BYVAL strUtf8 AS STRING) AS STRING
-
- LOCAL i AS LONG
- LOCAL strAscii AS STRING
- LOCAL idx AS LONG
- LOCAL c AS LONG
- LOCAL b2 AS LONG
- LOCAL fSkipChar AS LONG
-
- IF LEN(strUtf8) = 0 THEN EXIT FUNCTION
-
-
-
-
-
- strAscii = SPACE$(LEN(strUtf8))
-
-
-
- idx = 1
-
-
- FOR i = 1 TO LEN(strUtf8)
-
- IF fSkipChar THEN
- fSkipChar = 0
- ITERATE FOR
- END IF
-
- c = ASC(MID$(strUtf8, i, 1))
-
- IF c < 128 THEN
-
- MID$(strAscii, idx, 1) = MID$(strUtf8, idx, 1)
-
- idx = idx + 1
- ELSEIF c < 224 THEN
-
- b2 = ASC(MID$(strUtf8, i + 1, 1))
- IF b2 > 127 THEN
- c = (c - 192) * 64 + (b2 - 128)
- MID$(strAscii, idx, 1) = CHR$(c)
-
- fSkipChar = %TRUE
-
- idx = idx + 1
- END IF
- END IF
- NEXT
-
-
- FUNCTION = LEFT$(strAscii, idx - 1)
-
- END FUNCTION
....
strAnsiString = AsciiToUtf8("Проба"
? UTF8ToAscii(strAnsiString)
----
оставь слово 'Проба' в HEX UTF8... посмотрю...
Ответить
|
Номер ответа: 8 Автор ответа: Lapex
Вопросов: 6 Ответов: 56
|
Профиль | | #8
|
Добавлено: 10.01.09 20:44
|
Вообщеи удалось получить желаемый результат:- FUNCTION AnsiToUtf8 (BYVAL S AS STRING) AS STRING
- LOCAL Buffer AS STRING
- LOCAL length AS LONG
-
- Buffer = SPACE$(LEN(S) * 2)
- MultiByteToWideChar %CP_ACP, 0, BYVAL STRPTR (S), -1, BYVAL STRPTR(Buffer), LEN (Buffer)
- S = Buffer
- length = LEN (S)
- Buffer = SPACE$(length)
- WideCharToMultiByte %CP_UTF8, 0, BYVAL STRPTR (S), -1, BYVAL STRPTR (Buffer), LEN (Buffer), BYVAL (0), BYVAL (0)
- FUNCTION = Buffer
- END FUNCTION
-
- FUNCTION Utf8ToAnsi (BYVAL S AS STRING) AS STRING
- LOCAL Buffer AS STRING
- LOCAL length AS LONG
-
- Buffer = SPACE$(LEN(S) * 2)
- MultiByteToWideChar %CP_UTF8, 0, BYVAL STRPTR (S), -1, BYVAL STRPTR (Buffer), LEN (Buffer)
- S = Buffer
- length = LEN (S)
- Buffer = SPACE$(length)
- WideCharToMultiByte %CP_ACP, 0, BYVAL STRPTR (S), -1, BYVAL STRPTR(Buffer), LEN(Buffer), BYVAL (0), BYVAL (0)
- FUNCTION = Buffer
- END FUNCTION
-
- FUNCTION PBMAIN () AS LONG
- DIM S1 AS ASCIIZ * %MAXIMUM_REPARSE_DATA_BUFFER_SIZE
- S1 = "Проба!"
- S1 = AnsiToUtf8 (S1)
- ? S1
- S1 = Utf8ToAnsi(S1)
- ? S1
- END FUNCTION
Ответить
|
Страница: 1 |
Поиск по форуму