Что нового

[Данные, строки] Чтение( запись) в файл в кодировке 866, ОЕМ

СН3СН2ОН

Знающий
Сообщения
78
Репутация
12
На входе:
Windows 7 (32.64), Autoit_portable v3.3.14.2 и портативный Scite.

Ситуация:
Иногда необходимо читать и писать в файлы именно в этой кодировке. Причем файлы взаимосвязаны, их создают сторонние программы.

Что прочитано:
1
2
и производные от них

Что получилось:

Запись 1
Используем бинарный режим, метод тыка
Код:
#include <Encoding.au3>

$batnik = FileOpen($FolderC & '\cp_.bat', 2+16)
$batCode = 'что-то'
FileWrite($batnik, _Encoding_ANSIToOEM($batCode))
FileClose($batnik)


Запись 2
Метод форума
Код:
#include <WinAPIMisc.au3>

$batnik = FileOpen($FolderC & '\cp_.bat', 2+1024)
$batCode = 'что-то'
FileWrite($batnik, _WinAPI_CharToOem($batCode))
FileClose($batnik)


Чтение 1
Файл 111.txt можно получить набрав в CMD
Код:
echo превет!!! >> 111.txt
Код:
#include <Encoding.au3>
$F = @ScriptDir & '\111.txt'

ConsoleWrite('Кодировка файла ' & FileGetEncoding($F) & @CRLF)

$_L = FileOpen($F,512)
$file = FileRead($_L)
ConsoleWrite(_Encoding_866To1251($file))
ConsoleWrite(_Encoding_CyrillicTo1251($file))


Во всех методах записи Autoit видит,что кодировка файла 512
Код:
$F = @ScriptDir & '\111.txt'
ConsoleWrite('Кодировка файла ' & FileGetEncoding($F) & @CRLF)


Запись 2 (Автор InnI ), в первом варианте запись корректна(cmd отрабатывает),чтение из файла некорректно, а я посмотрел, код красивый и забрал, придется переделывать.
Второй вариант не тестировал, слишком сложно, мы же не UDF пишем.
Код:
#include <WinAPIMisc.au3>

$str = "сохраняем ANSI-строку в кодировке 866"

; вариант 1
$f = FileOpen("test1.txt", 2 + 1024)
$dos = _WinAPI_CharToOem($str)
FileWrite($f, $dos)
FileClose($f)

; вариант 2
$f = FileOpen("test2.txt", 2 + 512)
$aRet = DllCall('user32.dll', 'bool', 'CharToOemA', 'str', $str, 'str', '')
$dos = $aRet[2]
FileWrite($f, $dos)
FileClose($f)

На работе я сегодня использовал Запись 1, а дома вечером придумал Чтение 1.
И это нормальные рабочие варианты.

Собственно вопроса нет, только злость...
Пусть этот код поможет новичкам, как я.
А если у вас есть более продвинутые решения, поделитесь пожалуйста. Спасибо.


Upd.
Я очень сильно извиняюсь, но возможно причина в портативном Scite. Веду расследование.
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
Код:
#include <WinAPI.au3>
Const $OEM_CODEPAGE = 1
$srt = 'Привет'
$oem = _WinAPI_WideCharToMultiByte($srt, $OEM_CODEPAGE)
FileWrite('1.txt', $oem)
$encoding = FileGetEncoding('1.txt')
MsgBox(0, 'Кодировка файла', $encoding)
 
Автор
СН3СН2ОН

СН3СН2ОН

Знающий
Сообщения
78
Репутация
12
А теперь попробуйте запустить у себя это. "привет мир!" видно?
Код:
#include <WinAPI.au3>
Const $OEM_CODEPAGE = 1
$srt = 'echo привет мир!' &@CRLF&'pause'
$oem = _WinAPI_WideCharToMultiByte($srt, $OEM_CODEPAGE)
ConsoleWrite($oem)
FileWrite('1.cmd', $oem)
$encoding = FileGetEncoding('1.cmd')
MsgBox(0, 'Кодировка файла', $encoding)
 
Автор
СН3СН2ОН

СН3СН2ОН

Знающий
Сообщения
78
Репутация
12
У меня
Windows 7 (64), Autoit_portable v3.3.14.2 и портативный Scite.
И этот код не отрабатывает, на выходе месиво.
На работе нельзя ставить программы.
Возможно(скорее всего) дело в портативном Scite.
Заранее извиняюсь.
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
А вы хотите в консоле Scite читать OEM? Если так - то где то настраивается, или вы можете считать файл в OEM и перекодировать в ANSI или UTF-8, и тогда consolewrite нормально покажет.
 

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
СН3СН2ОН
Во всех методах записи Autoit видит,что кодировка файла 512
Естественно. А вы чего ожидали?

чтение из файла некорректно
Из-за нечётного количества символов в строке, в конец файла добавлен бинарный ноль. AutoIt решает, что файл бинарный. Если добавить/убрать символ, то нормально прочитает. Или файл нужно принудительно открыть в ANSI (512).

Второй вариант не тестировал, слишком сложно, мы же не UDF пишем.
А вот и зря. Как раз этот вариант работает без проблем. И при чём тут UDF я не понял.

inververs [?]
А у вас исходник в какой кодировке? Я все перепробовал - у меня тоже крокозябры в cmd-файле. Даже AkelPad'ом кодовую страницу подобрать не могу.

Alofa [?]
в штатном блокноте кракозябры
Выберите шрифт Terminal.
 
Автор
СН3СН2ОН

СН3СН2ОН

Знающий
Сообщения
78
Репутация
12
Alofa
Конечно отрабатывает, я готовые решения выложил, а не вопросы.
InnI
Естественно. А вы чего ожидали?
Не этого. Хотя кодировка 512 меня пока устраивает.

Сейчас тестировал и только на этом нормально работает - AutoIt 3,3,6,1 и Windows XP
AutoIt Portable + Дополнения
OffTopic:

Я вот читаю внимательно.



Добавлено:
Сообщение автоматически объединено:

Windows 7 (32.64), Autoit_portable v3.3.14.2 и портативный Scite Version 3.6.0.

Проблема была в не настроенном Scite, если вы скачали недавно, то можете поменять настройки
Файл SciTEGlobal.properties
Было
Код:
# Internationalisation
#NewFileEncoding=CodePage/UTF8BOM/UTF8/UTF16BE/UTF16LE         # Only available in SciTE4AutoIt3 version
#~ Enhance function of auto checking utf8: providing two methods
#~ utf8.auto.check=1 #  detect utf8 and add BOM automatically   Credits to SciTE-RU
#~ utf8.auto.check=2 # detect utf8 and do not add BOM
#~ utf8.auto.check=3 # detect ascii high characters and if none found set default encoding to UTF8 and add BOM
utf8.auto.check=4    # detect ascii high characters and if none found set default encoding to UTF8 and do not add BOM

# Japanese input code page 932 and ShiftJIS character set 128
#code.page=932
#character.set=128
# Unicode
#code.page=65001
code.page=0
#character.set=204
#command.discover.properties=python /home/user/FileDetect.py "$(FilePath)"
# Required for Unicode to work on GTK+:
#LC_CTYPE=en_US.UTF-8
Стало
Код:
# Internationalisation
#NewFileEncoding=CodePage/UTF8BOM/UTF8/UTF16BE/UTF16LE         # Only available in SciTE4AutoIt3 version
NewFileEncoding=CodePage
#~ Enhance function of auto checking utf8: providing two methods
#~ utf8.auto.check=1 #  detect utf8 and add BOM automatically   Credits to SciTE-RU
#~ utf8.auto.check=2 # detect utf8 and do not add BOM
#~ utf8.auto.check=3 # detect ascii high characters and if none found set default encoding to UTF8 and add BOM
utf8.auto.check=4    # detect ascii high characters and if none found set default encoding to UTF8 and do not add BOM

# Japanese input code page 932 and ShiftJIS character set 128
#code.page=932
#character.set=128
# Unicode
#code.page=65001
code.page=419
#character.set=204
#command.discover.properties=python /home/user/FileDetect.py "$(FilePath)"
# Required for Unicode to work on GTK+:
#LC_CTYPE=en_US.UTF-8

Единственное условие: файл с кодом необходимо создать снова
Найдено методом тыка.
Спасибо. тема закрыта.
 
Верх