Сейчас на форуме: hgdagon, asfa, bartolomeo (+4 невидимых)

 eXeL@B —› Программирование —› Convert to Unicode
. 1 . 2 . >>
Посл.ответ Сообщение

Ранг: 15.3 (новичок)
Активность: 0.010
Статус: Участник

Создано: 20 марта 2007 12:19
· Личное сообщение · #1

Barev dzez
Здраствуйте!
Нужно конвертировать текст в юникод, а потом записать в файл, но готовых функций я не нашел. Пробовал написать сам.
Только возникли некторые проблемы. Может есть уже готовые функции? Подскажите пожалуйста.



Ранг: 22.2 (новичок)
Активность: 0.010
Статус: Участник

Создано: 20 марта 2007 12:41
· Личное сообщение · #2

какие проблемы?



Ранг: 47.4 (посетитель)
Активность: 0.030
Статус: Участник

Создано: 20 марта 2007 12:46
· Личное сообщение · #3

Function CharToOem Lib "user32" Alias "CharToOemA" (ByVal lpszSrc As String, ByVal lpszDst As String) As Long

Конвертит текст в юникод

Function OemToChar Lib "user32" Alias "OemToCharA" (ByVal lpszSrc As String, ByVal lpszDst As String) As Long

и обратно




Ранг: 199.9 (ветеран), 4thx
Активность: 0.120.02
Статус: Участник

Создано: 20 марта 2007 12:50 · Поправил: YDS
· Личное сообщение · #4

На каком языке пишешь?
Еще можно заюзать готовые таблицы ASCII/Unicode симоволов, которые хранятся в файлах *.nls в подкаталоге виндов SYSTEM32




Ранг: 105.9 (ветеран)
Активность: 0.060
Статус: Участник

Создано: 20 марта 2007 12:55
· Личное сообщение · #5

n90p пишет:
готовых функций я не нашел

Что-то ты плохо искал.
Unicode and Character Set Functions
msdn2.microsoft.com/en-us/library/ms776415.aspx



Ранг: 110.7 (ветеран)
Активность: 0.070
Статус: Участник
~ tPORt ~

Создано: 20 марта 2007 13:24
· Личное сообщение · #6

MultiByteToWideChar и наоборот
=\
где искал то, раз ненашел )



Ранг: 22.2 (новичок)
Активность: 0.010
Статус: Участник

Создано: 20 марта 2007 16:36
· Личное сообщение · #7

SeQuick пишет:
Function CharToOem Lib "user32" Alias "CharToOemA" (ByVal lpszSrc As String, ByVal lpszDst As String) As Long
Конвертит текст в юникод
...


Они делают другую операцию с текстом
LazzY верно указал функции



Ранг: 47.4 (посетитель)
Активность: 0.030
Статус: Участник

Создано: 20 марта 2007 17:17 · Поправил: SeQuick
· Личное сообщение · #8

Myk пишет:
Они делают другую операцию с текстом


Вот интересно узнать какую же? В справке по апи написано что именно в юникод хотя сам не проверял.



Ранг: 15.3 (новичок)
Активность: 0.010
Статус: Участник

Создано: 20 марта 2007 17:30 · Поправил: n90p
· Личное сообщение · #9

SeQuick пишет:
В справке по апи написано что именно в юникод хотя сам не проверял.


Я такое не увидел.


LazzY пишет:
MultiByteToWideChar и наоборот
=\
где искал то, раз ненашел )


Не работает, можно хоть какой нибуть примерчик?
А искал я в справке солво Unicode и не нашел.

YDS пишет:
На каком языке пишешь?

Пишу на дельфи



Ранг: 47.4 (посетитель)
Активность: 0.030
Статус: Участник

Создано: 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



Ранг: 22.2 (новичок)
Активность: 0.010
Статус: Участник

Создано: 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 в руки и вперед! И что значит не работает? Оно не может не работать



Ранг: 47.4 (посетитель)
Активность: 0.030
Статус: Участник

Создано: 20 марта 2007 19:13
· Личное сообщение · #12

Myk пишет:
Оно не может не работать


Оно не может не работать если руки оттуда растут



Ранг: 15.3 (новичок)
Активность: 0.010
Статус: Участник

Создано: 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!



Ранг: 54.0 (постоянный)
Активность: 0.020
Статус: Участник

Создано: 20 марта 2007 21:49
· Личное сообщение · #14

n90p пишет:
YDS пишет:
На каком языке пишешь?
Пишу на дельфи


для семерки: system.pas
UTF8Encode/UTF8Decode - для UTF8;
Utf8ToUnicode/UnicodeToUtf8

из апи - упоминавшийся уже multibytetowidechar.



Ранг: 54.0 (постоянный)
Активность: 0.020
Статус: Участник

Создано: 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 байта - загадочно. должен быть цикл с перемещением указателя. или надо код привести? (лень дельфу открывать)



Ранг: 15.3 (новичок)
Активность: 0.010
Статус: Участник

Создано: 20 марта 2007 22:44
· Личное сообщение · #16

Нашел я в "system.pas" функцию "StringToWideChar", она более удобная.
Я тоже думаю, что проблема в write(f,uasd).

n1kto пишет:
или надо код привести?

Если можно.



Ранг: 54.0 (постоянный)
Активность: 0.020
Статус: Участник

Создано: 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.



Ранг: 158.4 (ветеран), 123thx
Активность: 0.140.49
Статус: Участник

Создано: 21 марта 2007 00:47
· Личное сообщение · #18

procedure TMainForm.Button1Click(Sender: TObject);
var
s: AnsiString;
ws: WideString;
begin
s:= 'Some ansi string';
ws:= WideString(s);
end;






Ранг: 54.0 (постоянный)
Активность: 0.020
Статус: Участник

Создано: 21 марта 2007 06:07
· Личное сообщение · #19

rmn пишет:
procedure TMainForm.Button1Click(Sender: TObject);
var
s: AnsiString;
ws: WideString;
begin
s:= 'Some ansi string';
ws:= WideString(s);
end;


да, я знаю. не факт что при этом произвдится приведение к юникоду. не проверял, поэтому и не написал.



Ранг: 15.3 (новичок)
Активность: 0.010
Статус: Участник

Создано: 21 марта 2007 14:39
· Личное сообщение · #20

rmn пишет:
procedure TMainForm.Button1Click(Sender: TObject);
var
s: AnsiString;
ws: WideString;
begin
s:= 'Some ansi string';
ws:= WideString(s);
end;


Проверил, не получается!




Ранг: 793.4 (! !), 568thx
Активность: 0.740
Статус: Участник
Шаман

Создано: 21 марта 2007 15:03
· Личное сообщение · #21

n1kto пишет:
for j := 1 to i*2 do write(f,c[j]);

Зачем так извращаться, лучше уж винапи задействовать, там можно размер буфера указать. Хотя есть и в Delphi функции работы с буфером (BlockWrite).

-----
Yann Tiersen best and do not fuck




Ранг: 15.3 (новичок)
Активность: 0.010
Статус: Участник

Создано: 21 марта 2007 15:18
· Личное сообщение · #22

PE_Kill пишет:
n1kto пишет:
for j := 1 to i*2 do write(f,c[j]);
Зачем так извращаться, лучше уж винапи задействовать, там можно размер буфера указать. Хотя есть и в Delphi функции работы с буфером (BlockWrite).


А можно попадробнее, пожалуйста?



Ранг: 54.0 (постоянный)
Активность: 0.020
Статус: Участник

Создано: 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;
...



Ранг: 228.7 (наставник), 2thx
Активность: 0.120
Статус: Участник
malware research

Создано: 21 марта 2007 21:16
· Личное сообщение · #24

WCHAR UnicodeNameBuff[64];

MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, "my test ansi string", -1, UnicodeNameBuff, 64);

wprintf(L"%s", UnicodeNameBuff);

Это работает

-----
Research is my purpose




Ранг: 15.3 (новичок)
Активность: 0.010
Статус: Участник

Создано: 22 марта 2007 15:23
· Личное сообщение · #25

Error_Log пишет:
wprintf(L"%s", UnicodeNameBuff);


n90p пишет:
YDS пишет:
На каком языке пишешь?
Пишу на дельфи




Ранг: 158.4 (ветеран), 123thx
Активность: 0.140.49
Статус: Участник

Создано: 22 марта 2007 17:35
· Личное сообщение · #26

n90p
Ну раз пишешь на дельфи, то должен знать, что тебе нет необходимости вызывать API для таких операций, как присвоение, сравнение, преобразование типа строк. Достаточно выполнить приведение типа (как в примере, что я дал), а компилер сам заменит это на вызов WStrFromLStr (с присвоением аналогично - ты используешь s:= 'some string', компилер заменяет это на вызов LStrAsg и т.п.).



Ранг: 15.3 (новичок)
Активность: 0.010
Статус: Участник

Создано: 23 марта 2007 18:32
· Личное сообщение · #27

rmn пишет:
Ну раз пишешь на дельфи, то должен знать, что тебе нет необходимости вызывать API для таких операций, как присвоение, сравнение, преобразование типа строк


А как по твойму я должен записать этот результат в файл?
Я же пробовал, потаму и говорю.



Ранг: 1.3 (гость)
Активность: 0.010
Статус: Участник

Создано: 23 марта 2007 20:42
· Личное сообщение · #28

а почему бы програмкой какой то не конвертировать



Ранг: 75.0 (постоянный)
Активность: 0.040
Статус: Участник

Создано: 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;



Ранг: 15.3 (новичок)
Активность: 0.010
Статус: Участник

Создано: 01 апреля 2007 19:41
· Личное сообщение · #30

andy007
Потаму что я должен сам написать программку

Rush
Пасибки.


. 1 . 2 . >>
 eXeL@B —› Программирование —› Convert to Unicode
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати