Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / Как переконвертировать файл из Unicode в ASCII? / 6 сообщений из 6, страница 1 из 1
14.08.2009, 08:57
    #36143477
Alexandr Minzer
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как переконвертировать файл из Unicode в ASCII?
Делаю так:

Файл в unicode открываю с помощью класса %File
Код: plaintext
Set sc=filefrom.Open("RK\UTF8\")
Затем открываю новый файл на запись, построчно читаю первый и вывожу во второй. Пробовал выводить, как есть строку Set sc=fileto.WriteLine(str) и еще раз предварительно перекодировав Set sc=fileto.WriteLine($zconvert(str,"o","UTF8")).

Нужного результата не получил.
Получается вот что:
Код: plaintext
B u t t o n
где пробелы это $C(0).
Можно конечно попробовать к считанной строке применить функцию $tr(str,$c(0),""), но это кажется будет неправильно.
Как правильно мне переконвертировать файл из Unicode в ASCII?

Код метода:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
Include (%occStatus, %occConstant)

Class tmp.tmp[ Abstract ]
{

ClassMethod ConvertToASCII(fn As %String)
{
	Set filefrom=##class(%File).%New()
	Set filefrom.Name=fn
	Set sc=filefrom.Open("RK\UTF8\")
	If $$$ISOK(sc) {
		Set fileto=##class(%File).%New()
		Set fileto.Name="d:\2.txt"
		Set sc=fileto.Open("NW")
		If $$$ISOK(sc) {
			While filefrom.AtEnd= 0  {
				Set len= 32000 
				Set str=filefrom.Read(.len)
				Set sc=fileto.WriteLine($tr(str,$c( 0 ),""))
				If $$$ISERR(sc) {
					Do $system.OBJ.DisplayError(sc)
				}
			}
			Do fileto.Close()
		}
		Set fileto=$$$NULLOREF
		//
		Do filefrom.Close()
	}
	Set filefrom=$$$NULLOREF
}

}
...
Рейтинг: 0 / 0
14.08.2009, 10:26
    #36143636
Ptn
Ptn
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как переконвертировать файл из Unicode в ASCII?
Может быть выхотели написать ?

Код: plaintext
1.
 Set sc=fileto.WriteLine($zconvert(str,"o","CP1251")).
...
Рейтинг: 0 / 0
14.08.2009, 10:28
    #36143639
Ptn
Ptn
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как переконвертировать файл из Unicode в ASCII?
Ну и
Код: plaintext
1.
2.
3.
		Set fileto=##class(%File).%New()
		Set fileto.Name="d:\2.txt"
		Set sc=fileto.Open("NWK\CP1251\")
как вариант
...
Рейтинг: 0 / 0
14.08.2009, 10:32
    #36143652
Alexey Maslov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как переконвертировать файл из Unicode в ASCII?
У Вас, по-видимому, установлена Юникодовская локаль, в которой режим открытия файлов по умолчанию UTF8. Т.е. Вы просто копируете файл, не меняя кодировку. Прислушайтесь к совету опередившего меня Ptn :) или измените режим открытия файла:
Код: plaintext
Set sc=fileto.Open("NWK\CP1251\")
Еще мне не нравится смешение операций Read и WriteLine, как и вообще использование класса %File (ибо куда как прозрачнее выглядел бы подобный код на чистом М, с помощью команд Open/Use/Read/Write - и контроля больше, например, легко увидеть режим текущего устройства: $ZMode), но это к рассматриваемой проблеме отношения не имеет :)
...
Рейтинг: 0 / 0
14.08.2009, 10:39
    #36143668
servit
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как переконвертировать файл из Unicode в ASCII?
Например, так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
Set filefrom=##class(%File).%New(fn)
Do filefrom.Open("RUK\UTF8\")

Set fileto=##class(%FileCharacterStream).%New()
Set fileto.Filename="D:\2.txt"
Set fileto.TranslateTable="CP1251" ;CP866,KOI8R
Do fileto.CopyFromAndSave(filefrom)

PS: в общем случае нельзя 16 бит привести к 8 без потерь.
...
Рейтинг: 0 / 0
14.08.2009, 10:39
    #36143669
Ptn
Ptn
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как переконвертировать файл из Unicode в ASCII?
Я так вообще, в последнее время, предпочитаю пользоваться %BinaryStream.

Ибо что %File с указанием кодировки, что старые добрые Open Use Close в уникодных инсталяциях ведут себя "непонятно".

То есть непонятно ведет себя конечно же код - до этого нормально работавший на 8-битных инсталяциях. Причем финты какие то хитрые - либо при чтении меняется смещение на один байт, либо при записи в каком то одном месте, вставляет один лишний байт.

Отловить "багу" не удалось - решил переходом на %BinaryStream
...
Рейтинг: 0 / 0
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / Как переконвертировать файл из Unicode в ASCII? / 6 сообщений из 6, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]