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

Файл в 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
Как переконвертировать файл из Unicode в ASCII?
    #36143636
Ptn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Может быть выхотели написать ?

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

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

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

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


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