Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2007.08.26;
Скачать: [xml.tar.bz2];

Вниз

Преобразовать текст в Unucode   Найти похожие ветки 

 
Antonito   (2007-08-05 01:19) [0]

Здравствуйте.
Подскажите пожалуйста как преобразовать текст (string) в кодировку unicode.
Пробовал функцией StringToWideChar, но если проверить текст на выходе (поместить его в какой-нибудь TMemo или вывести через ShowMessage), то текст отображается не в unicode-кодировке, а в оригинале.

Пробовал и так:
function StringToUnicode(Value: string): WideString;
begin
 SetLength(Result, length(Value));
 MultiByteToWideChar(CP_ACP, 0, PChar(Value), length(Value), PWideChar(Result), length(Value));
end;

то же самое.

Вобщем, мне нужно текст из Memo1 преобразовать в unicode и в таком виде, к примеру, сохранить его в файл.
Подскажите пожалуйста.


 
Плохиш ©   (2007-08-05 01:38) [1]


> Пробовал функцией StringToWideChar, но если проверить текст
> на выходе (поместить его в какой-нибудь TMemo или вывести
> через ShowMessage), то текст отображается не в unicode-кодировке,
>  а в оригинале.

TMemo и ShowMessage не поддерживают юникоде, соответственно происходит обратное преобразование. Добавь в свой юникоде, к примеру, ü и получишь знак вопроса. Используй функцию MessageBoxW.


 
Antonito   (2007-08-05 02:06) [2]

Ok, этот момент понял. Спасибо.
А вот ещё такое...Чтобы сохранить unicode-текст в файл - как это лучше реализовать?


 
MetalFan ©   (2007-08-05 08:25) [3]


var
 lFS: TFileStream;
 lAStr: string;
 lWStr: WideString;
begin
 lAStr := "строка, которая будет преобразована в unicode";
 lWStr := lAStr;
 lFS := TFileStream.create( "unicode.txt", fmCreate );
 lFS.Write( lWStr[1], Length(lWStr) * 2 );
 lFS.Free;


 
Anatoly Podgoretsky ©   (2007-08-05 11:27) [4]

> MetalFan  (05.08.2007 08:25:03)  [3]

Что здесь делает * 2, придумываешь проблему 2000 на ровном месте.


 
Инс ©   (2007-08-05 11:34) [5]


> [4] Anatoly Podgoretsky ©   (05.08.07 11:27)

Вы не поверите, но MetalFan прав ;)


 
Zagaevskiy ©   (2007-08-05 11:37) [6]

Извините, Анатолий, но привлекаю Ваше внимание :
http://delphimaster.net/view/9-1183987668/
http://delphimaster.net/view/9-1183987668/
http://delphimaster.net/view/9-1183987668/


 
Yanis ©   (2007-08-05 12:12) [7]

Ну * 2 это потому что 16-битный Unicode в Delphi.
Истинно не понимаю нареканий
> Anatoly Podgoretsky ©   (05.08.07 11:27) [4]


 
MetalFan ©   (2007-08-05 12:13) [8]

Ладно) если уж совсем красиво, то так: Length(lWStr) * SizeOf(WideChar)


 
Инс ©   (2007-08-05 12:14) [9]

Анатолий ушел учить матчасть :)


 
Anatoly Podgoretsky ©   (2007-08-05 12:16) [10]

> Инс  (05.08.2007 11:34:05)  [5]

Естественно не поверю.
Но напомню "Борис ты не прав"
А если не понятна мысль, то посоветую почитать разделы справки и культуру программирования, использовать числовые hard coded значения вместо расчетных констант - это даже не плохой тон, а самоубийство или ламерство. Такое очень наблюдалось во время перехода с 16 бит на 32, когда прекращал работать код X * 2, вместо написания Х * SizeOf(Integer) - здесь именно этот случай.


 
Yanis ©   (2007-08-05 12:18) [11]


> SizeOf(WideChar)

Блин ну это понятно.
Но компилятор Delphi вроде более 16-битную кодировку и не поддерживает. Имеет смысл для совместимости разве только :)
Я думал тут что то грандиозное :o)


 
Anatoly Podgoretsky ©   (2007-08-05 12:18) [12]

> Yanis  (05.08.2007 12:12:07)  [7]

Кто сказал, не соблаговольшь ли взглянуть в справку и ознакомиться, что такое юникод вообще.
Кроме того даже если и 16-битный, то это не повод писать * 2, но он не 16 битный, он много шире. В справке хорошо документировано.


 
Anatoly Podgoretsky ©   (2007-08-05 12:21) [13]

> MetalFan  (05.08.2007 12:13:08)  [8]

> Length(lWStr) * SizeOf(WideChar)

Вот здесь нет замечаний, все профессионально.


 
Anatoly Podgoretsky ©   (2007-08-05 12:22) [14]

> Yanis  (05.08.2007 12:18:11)  [11]

Это вообще ересь, поддерживает и 16 битную и 32 битную


 
Инс ©   (2007-08-05 12:23) [15]


> [10] Anatoly Podgoretsky ©   (05.08.07 12:16)

Анатолий, от того, что напишешь SizeOf(WideChar), программа переносимее не станет, разве что на уровне исходного кода.
Плюс, не вижу ничего страшного в данно конкретном случае, что бы напомнило мне проблему 2000


 
Yanis ©   (2007-08-05 12:26) [16]


> Это вообще ересь, поддерживает и 16 битную и 32 битную

Возможно мы по разному воспринимаем слово "поддерживает".
В справке про Wide String написано вот, что:

> The WideString type represents a dynamically allocated string
> of 16-bit Unicode characters.

Я основывался на этом.


 
Anatoly Podgoretsky ©   (2007-08-05 12:27) [17]

Станет и еще как станет.
Так же говорили и во времена 16 битных компиляторов, а потом годами растешали проблемы. Тоже было и с проблемой 2К - точно также утверждали, что двух байт для года хватит, а не хватило, и hard code constants прямо относятся к этой проблеме, не надо писать * число, обязательно писать SizeOf(Type)


 
Инс ©   (2007-08-05 12:29) [18]


> Станет и еще как станет.

Т.е. Вы утверждаете, что если написать SizeOf(WideChar), то однажды написанная и скомпилированная таким образом программа будет работать даже тогда, когда WideChar будет 10-битным?


 
Anatoly Podgoretsky ©   (2007-08-05 12:30) [19]


> > The WideString type represents a dynamically allocated
> string
> > of 16-bit Unicode characters.
>
> Я основывался на этом.

Ты основываешься не на том, разница тут распределяется на UCS-2 и UCS-4 и в справке


> The Windows operating system supports Unicode (UCS-2). The
> Linux operating system supports UCS-4, a superset of UCS-
> 2. Borland"s RAD products support UCS-2 on both platforms.
>

И не только Borland"s RAD а и язык Дельфи и ее исполнимый код


 
Anatoly Podgoretsky ©   (2007-08-05 12:31) [20]


> Инс ©   (05.08.07 12:29) [18]

Утверждаю, и так уже было для Integer и других типов


 
Anatoly Podgoretsky ©   (2007-08-05 12:33) [21]

И чего копья ломаете на ровном месте?
MetalFan ©   (05.08.07 12:13) [8] просто признал этот факт и исправился, а вы сомневаетесь в основах языка и культуре программирования.
Тема то страра как мир


 
Инс ©   (2007-08-05 12:34) [22]


> [20] Anatoly Podgoretsky ©   (05.08.07 12:31)

Тогда посмотрите в окошке CPU, как компилятор справится со следующим кодом:
Caption:=IntToStr(SizeOf(WideChar));

Потом расскажите.


 
Yanis ©   (2007-08-05 12:36) [23]


> а вы сомневаетесь

Не знаю кто как, а я просто хотел всё предельно для себя прояснить.
Никаких переворотов совершить не стремился :)


 
Инс ©   (2007-08-05 12:51) [24]

Ну, посмотрели? Там ключевая строчка
mov eax,$00000002


 
Yanis ©   (2007-08-05 12:53) [25]


> Ну, посмотрели? Там ключевая строчка
> mov eax,$00000002

Ну а что ожидается? Конечно 2, т.к. компилятор знает размер.


 
Инс ©   (2007-08-05 12:55) [26]


> [25] Yanis ©   (05.08.07 12:53)

Не знаю, что ожидается. Посмотрите на [20], у него и спросите


 
Anatoly Podgoretsky ©   (2007-08-05 12:55) [27]

А скажем на другой RAD это будет mov eax,$00000004


 
Инс ©   (2007-08-05 12:56) [28]


> А скажем на другой RAD это будет mov eax,$00000004

Безусловно, но меня интересует именно утверждение [20] в ответ на [18]


 
Yanis ©   (2007-08-05 12:57) [29]


> А скажем на другой RAD это будет mov eax,$00000004

Т.е. не "RAD", а "компилятор" имелось ввиду наверняка.


 
Инс ©   (2007-08-05 12:58) [30]


> [29] Yanis ©   (05.08.07 12:57)

Наверное


 
Yanis ©   (2007-08-05 13:00) [31]


> Безусловно, но меня интересует именно утверждение [20] в
> ответ на [18]

Кажется я понял в чём раздор.
Инс имеет ввиду готовый бинарник в котором конечно же размер 2 уже вшит, а Anatoly Podgoretsky говорит скорее всего о переносимости исходников.


 
Инс ©   (2007-08-05 13:01) [32]

Янис, я говорил про переносимость на уровне исходника. Но Анатолий утверждает [20] в ответ на [18]


 
Anatoly Podgoretsky ©   (2007-08-05 13:14) [33]

> Инс  (05.08.2007 12:56:28)  [28]

Так в 20 указано, что для generic типов размер определен только на отдельном участке времени и на отдельной реализации компилятора. Написание SizeOf(Type) позволяет избежать ошибок и полного переписывания проекта при миграции или изменение типов.
Те кто это не придерживаются, пожизненно занимаются сексом с компилятором.
Правда этим они очень хорошо защищают свои рабочии места, но иногда и лишаются их.
Наиболее наглядно это произошло в период перехода с 16 бит на 32.
А с тех пор среда еще больше расширилась, у многих их них еще большие проблемы при переходе или на Линух или на .NET

P.S. WideChar это Generic тип, но тоже самое правильно писать для любых типов, даже для фундаментальных. Поскольку какая разница изменится тип или программист сменит тип например с Word на Integer - программа должна работать без переписывания кода, не делая поиск 2 и замена его на 4, а это не всегда и возможно.

Зачем себя загонять в угол. Всего то надо соблюдать культуру программирования, быть профессионалом, а не воинствующим ламером. Подобное поведение должно быть на уровне генокода.


 
Anatoly Podgoretsky ©   (2007-08-05 13:16) [34]

> Yanis  (05.08.2007 12:57:29)  [29]

Имелся в виду именно другой RAD, например Kylix, .NET - это включает и будущие RAD
Не застреваем в 2000 году.


 
Anatoly Podgoretsky ©   (2007-08-05 13:16) [35]

> Yanis  (05.08.2007 13:00:31)  [31]

Я говорю о программирование и об конкретном приведеном коде.


 
Dib@zol ©   (2007-08-05 13:18) [36]

> быть профессионалом, а не воинствующим ламером.

Это ты инсу? Мдя...


 
Anatoly Podgoretsky ©   (2007-08-05 13:20) [37]

> Инс  (05.08.2007 13:01:32)  [32]

Это твой вывод и неверный, ты вложил свои слова в моим уста. Я говорю о культуре написания исходных текстов. А то что 16 битный код, даже ДОС может исполняться на Windows 2003 не имеет отношения к проблеме правильного написания исходного кода.
Те кто не придерживался этого жестоко пострадали, первый раз при переходе на платформу 32, потом при переходе на 2000 год, а в основе лежала одна и таже проблема, мол все сойдет, на мой век хватит.


 
Инс ©   (2007-08-05 13:21) [38]

Анатолий, я безусловно согласен с тем, что для того, чтобы исходный код был переносим между различными компиляторами, нужно придерживаться тех или иных правил. И то, даже если их соблюдать, далеко не всегда получается безболезненно перенести свой проект на новую версию. Но в своем вопросе [18] я не двусмысленно написал, "однажды написанная и скомпилированная", на что вы ответили [20]. Вот этот момент мне бы хотелось прояснить.


 
Anatoly Podgoretsky ©   (2007-08-05 13:33) [39]

> Dib@zol  (05.08.2007 13:18:36)  [36]

Нет не ему, а всем кто этого понять не хочет.


 
имя   (2007-08-05 13:34) [40]

Удалено модератором



Страницы: 1 2 вся ветка

Форум: "Начинающим";
Текущий архив: 2007.08.26;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.55 MB
Время: 0.039 c
2-1185780445
andreyka
2007-07-30 11:27
2007.08.26
Удаление записи в реестре


15-1185345776
WondeRu at work
2007-07-25 10:42
2007.08.26
Кинули на фрилансе


2-1185989348
rlzzz
2007-08-01 21:29
2007.08.26
Люди Как массив заполнить?


15-1185354885
Kerk
2007-07-25 13:14
2007.08.26
Федор Черенков


15-1185823684
ArtemESC
2007-07-30 23:28
2007.08.26
Пролил квас на клаву...





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский