Сейчас на форуме: hgdagon, asfa, bartolomeo (+4 невидимых) |
eXeL@B —› Программирование —› Convert to Unicode |
. 1 . 2 . >> |
Посл.ответ | Сообщение |
|
Создано: 20 марта 2007 12:19 · Личное сообщение · #1 |
|
Создано: 20 марта 2007 12:41 · Личное сообщение · #2 |
|
Создано: 20 марта 2007 12:46 · Личное сообщение · #3 |
|
Создано: 20 марта 2007 12:50 · Поправил: YDS · Личное сообщение · #4 |
|
Создано: 20 марта 2007 12:55 · Личное сообщение · #5 |
|
Создано: 20 марта 2007 13:24 · Личное сообщение · #6 |
|
Создано: 20 марта 2007 16:36 · Личное сообщение · #7 |
|
Создано: 20 марта 2007 17:17 · Поправил: SeQuick · Личное сообщение · #8 |
|
Создано: 20 марта 2007 17:30 · Поправил: n90p · Личное сообщение · #9 SeQuick пишет: В справке по апи написано что именно в юникод хотя сам не проверял. Я такое не увидел. LazzY пишет: MultiByteToWideChar и наоборот =\ где искал то, раз ненашел ) Не работает, можно хоть какой нибуть примерчик? А искал я в справке солво Unicode и не нашел. YDS пишет: На каком языке пишешь? Пишу на дельфи |
|
Создано: 20 марта 2007 17:37 · Поправил: SeQuick · Личное сообщение · #10 n90p пишет: Я такое не увидел Фунция CharToOem Declare Function CharToOem Lib "user32" Alias "CharToOemA" (ByVal lpszSrc As String, ByVal lpszDst As String) As Long Платформа Windows 95/98: Поддерживается Windows NT: Требуется Windows NT 3.1 или выше Windows 2000: Поддерживается CharToOem конвертирует текст из win-кодировки в dos-кодировку Возвращаемое значение Функция всегда возвращает ненулевое значение Параметры lpszSrc Строка для перекодировки lpszDst Перекодированая строка в буфере. Если функция CharToOem используется как функция ANSI, строка может быть переведена на месте, устанавливая параметр lpszDst в тот же адрес,что и параметр lpszSrc Пример ' конвертируем строку "Русский_Проект!" в dos-кодировку. Dim sourcestring As String ' нужная строка Dim deststring As String ' получаемая строка Dim code As Long sourcestring = "Русский Проект" 'строка для перекодировки deststring = Space$(Len(sourcestring))'получаем перекодированную строку code = CharToOem(sourcestring, deststring) Debug.Print deststring |
|
Создано: 20 марта 2007 18:51 · Личное сообщение · #11 SeQuick пишет: Вот интересно узнать какую же? В справке по апи написано что именно в юникод хотя сам не проверял. Не, ну блин The CharToOem function translates a string into the OEM-defined character set. The OemToChar function translates a string from the OEM-defined character set into either an ANSI or a wide-character string. Т.е. еще OemToChar можно применить для этих целей, но при условии что у нас текст в OEM-defined character set. А у n90p я так понял просто обычный текст. MultiByteToWideChar в руки и вперед! И что значит не работает? Оно не может не работать |
|
Создано: 20 марта 2007 19:13 · Личное сообщение · #12 |
|
Создано: 20 марта 2007 21:38 · Личное сообщение · #13 Myk пишет: И что значит не работает? Оно не может не работать Тогда скажи пожалуйста в чем ошибка? procedure TForm1.Button1Click(Sender: PObj); const asd:pansichar='asdfgh'; var uasd:pwidechar; f:textfile; begin assignfile(f,'file.txt'); rewrite(f); multibytetowidechar(CP_ACP,0,asd,-1,uasd,0); write(f,uasd); closefile(f); end; Файл "file.txt" создается, но размер всего 3 байта, а должен быть 12! |
|
Создано: 20 марта 2007 21:49 · Личное сообщение · #14 |
|
Создано: 20 марта 2007 21:56 · Личное сообщение · #15 n90p пишет: var uasd:pwidechar; таки смотри msdn: MultiByteToWideChar The MultiByteToWideChar function maps a character string to a wide-character (Unicode) string. The character string mapped by this function is not necessarily from a multibyte character set. int MultiByteToWideChar( UINT CodePage, // code page DWORD dwFlags, // character-type options LPCSTR lpMultiByteStr, // string to map int cbMultiByte, // number of bytes in string LPWSTR lpWideCharStr, // wide-character buffer int cchWideChar // size of buffer ); ...бла... Return Values If the function succeeds, and cchWideChar is nonzero, the return value is the number of wide characters written to the buffer pointed to by lpWideCharStr. If the function succeeds, and cchWideChar is zero, the return value is the required size, in wide characters, for a buffer that can receive the translated string. If dwFlag equals zero, the input string is UTF-8 and contains invalid characters the function returns ERROR_NO_UNICODE_TRANSLATION. If the function fails, the return value is zero. To get extended error information, call GetLastError. GetLastError may return one of the following error codes: ERROR_INSUFFICIENT_BUFFER ERROR_INVALID_FLAGS ERROR_INVALID_PARAMETER ERROR_NO_UNICODE_TRANSLATION таки да. надо сперва размер данных которые получатся определить. а код n90p пишет: write(f,uasd); записывает вовсе не данные из буфера. и как у тебя получилось при этом 3 байта - загадочно. должен быть цикл с перемещением указателя. или надо код привести? (лень дельфу открывать) |
|
Создано: 20 марта 2007 22:44 · Личное сообщение · #16 |
|
Создано: 20 марта 2007 23:02 · Поправил: n1kto · Личное сообщение · #17 n90p пишет: n1kto пишет: или надо код привести? Если можно. program Project1; {$APPTYPE CONSOLE} uses windows, SysUtils; const asd: pansichar = 'asdfgh'; var c: array[ 1..30 ] of char; i,j: Integer; uasd: pwidechar; f: textfile; begin assignfile(f, 'file.txt'); rewrite(f); uasd := @c; i := multibytetowidechar(CP_ACP, 0, asd, -1, uasd, 15); for j := 1 to i*2 do write(f,c[j]); closefile(f); end. |
|
Создано: 21 марта 2007 00:47 · Личное сообщение · #18 |
|
Создано: 21 марта 2007 06:07 · Личное сообщение · #19 |
|
Создано: 21 марта 2007 14:39 · Личное сообщение · #20 |
|
Создано: 21 марта 2007 15:03 · Личное сообщение · #21 |
|
Создано: 21 марта 2007 15:18 · Личное сообщение · #22 |
|
Создано: 21 марта 2007 21:06 · Поправил: n1kto · Личное сообщение · #23 PE_Kill пишет: Зачем так извращаться, лучше уж винапи задействовать, там можно размер буфера указать. Хотя есть и в Delphi функции работы с буфером (BlockWrite). действительно, через апи проще. а blockwrite, если я правильно помню (использовал еще под дос в BP7) работает только с нетипизированными файлами. Тут же - текстовый. из хелпа: Delphi syntax: procedure BlockWrite(var f: File; var Buf; Count: Integer [; var AmtTransferred: Integer]); F is an untyped file variable, Buf is any variable, Count is an expression of type Integer, and AmtTransferred is an optional variable of type Integer. BlockWrite writes Count or fewer records to the file F from memory, starting at the first byte occupied by Buf. The actual number of complete records written (less than or equal to Count) is returned in AmtTransferred. ... что я и говорил. пример из хелпа: ... var FromF, ToF: file; NumRead, NumWritten: Integer; Buf: array[1..2048] of Char; begin if OpenDialog1.Execute then { Display Open dialog box } begin AssignFile(FromF, OpenDialog1.FileName); Reset(FromF, 1); { Record size = 1 } if SaveDialog1.Execute then { Display Save dialog box} begin AssignFile(ToF, SaveDialog1.FileName); { Open output file } Rewrite(ToF, 1); { Record size = 1 } Canvas.TextOut(10, 10, 'Copying ' + IntToStr(FileSize(FromF)) + ' bytes...'); repeat BlockRead(FromF, Buf, SizeOf(Buf), NumRead); BlockWrite(ToF, Buf, NumRead, NumWritten); until (NumRead = 0) or (NumWritten <> NumRead); CloseFile(FromF); CloseFile(ToF); end; end; end; ... |
|
Создано: 21 марта 2007 21:16 · Личное сообщение · #24 |
|
Создано: 22 марта 2007 15:23 · Личное сообщение · #25 |
|
Создано: 22 марта 2007 17:35 · Личное сообщение · #26 n90p Ну раз пишешь на дельфи, то должен знать, что тебе нет необходимости вызывать API для таких операций, как присвоение, сравнение, преобразование типа строк. Достаточно выполнить приведение типа (как в примере, что я дал), а компилер сам заменит это на вызов WStrFromLStr (с присвоением аналогично - ты используешь s:= 'some string', компилер заменяет это на вызов LStrAsg и т.п.). |
|
Создано: 23 марта 2007 18:32 · Личное сообщение · #27 |
|
Создано: 23 марта 2007 20:42 · Личное сообщение · #28 |
|
Создано: 24 марта 2007 00:33 · Личное сообщение · #29 n1kto пишет: да, я знаю. не факт что при этом произвдится приведение к юникоду. не проверял, поэтому и не написал. Если уж пошло обсуждение VCL, то я делал так (синтаксис C++): AnsiString Text; wchar_t *str = new wchar_t[Text.WideCharBufSize()]; Text.WideChar(str,Text.WideCharBufSize()); // str - будет юникод delete [] str; |
|
Создано: 01 апреля 2007 19:41 · Личное сообщение · #30 |
. 1 . 2 . >> |
eXeL@B —› Программирование —› Convert to Unicode |