Вход | Регистрация


1С:Предприятие :: 1С:Предприятие 7.7 и ранее

v7: Кодировка дурит (Объект Текст)

v7: Кодировка дурит (Объект Текст)
Я
   Эльниньо
 
22.08.18 - 16:30
Windows 10

Т = СоздатьОбъект("Текст");
Т.ДобавитьСтроку(Стр);
Т.Записать(СокрП(Константа.КаталогФТПСервера) + "\" + НЗП.НомерДок + ".onec");

Создаёт файлы в кодировках Windows-1251, Windows-1252, Windows-1255.
Создал 8 файлов.
Из них вWindows-1251 - 5
в Windows-1252 - 2
в Windows-1255 - 1

Что это может быть?
 
 
   Сияющий в темноте
 
1 - 22.08.18 - 16:32
При перекодировании из двухбайтовой кодировки в однобайтовую используется информация о текущей раскладке клавиатуры - то есть если РУС, то будет Windows-1251, если LAT - то Windows-1252 остальных, вроде бы, быть не должно.
   Эльниньо
 
2 - 22.08.18 - 16:36
(1) Спасибо. Но ... при каком раскладе 1255 получается
   Эльниньо
 
3 - 22.08.18 - 16:49
(1) Попробовал. 1 файл создал в РУС, другой в ENG.
Оба записались в 1251
Толи древнии клюшки плохо с 10-кой дружат, толи... скорее бы пятница, банька и болт на ЗОЖ
   trad
 
4 - 22.08.18 - 16:52
а по каким признакам ты понимаешь что 1251/1252/1255 ?
   Сияющий в темноте
 
5 - 22.08.18 - 17:02
Не забываем, что отображение Unicode->Ansi необратимо, и большое множество символов Unicode могут отображаться в один единственный символ в однобайтовой кодировке.
Кроме того, возможно, что у вас кодировка правленая в реестре, из-за чего может получаться кривое её опознание текстовым редактором, который её открывает.
Попробуйте все записанные файлы явно открыть в Windows-1251 и посмотреть, что там будет.
   Franchiser
 
6 - 22.08.18 - 17:04
Пиши через  OpenTextFile()
   Сияющий в темноте
 
7 - 22.08.18 - 17:11
(6) Там, кстати, будет тоже самое, так как или писать в Unicode (а как потом читать) или то же самое преобразование, только ещё и несколько раз - сначала OneByte->DoubleByte при передаче строки в метод Write, когда он вызывается из 1С, а потом обратно DoubleByte->OneByte при записи текста, а если символ не найдётся, то можно словить исключение.
   Эльниньо
 
8 - 22.08.18 - 17:12
Попробовал V7TextFile и fso.CreateTextFile.
Та же хрень. То 1251, то 1252
   Эльниньо
 
9 - 22.08.18 - 17:16
(4) Far показывает. Да и принимающая сторона гневные скриншоты шлёт
   Сияющий в темноте
 
10 - 22.08.18 - 17:17
Попробуй в реестре
HKEY_LOCAL_MACHINE\ SYSTEM\ CurrentControlSet\Control\ Nls\ CodePage
Прописать ACP => 1251.
Может, поможет.
 
 Рекламное место пустует
   Сияющий в темноте
 
11 - 22.08.18 - 17:18
Что ты там такого передаёшь ?
Русский текст 1С никогда не гадила.
   Эльниньо
 
12 - 22.08.18 - 17:22
(11) Вот это вот записалось в 1252
id##
idonec##0495Ê06605
status##status
total##5914.2
creator##95001656
customer##95001656
manager##0
company##00001
date-create##01.04.18 06:00:00
date-status##                
canceled##N
comment##
manager-comment##
order-fields##
basket##ID4515:1:4701.9;ID4508:1:1347
store##4-002

а вот это:

id##212634
idonec##1195Т01687
status##status
total##15581
creator##00011
customer##00011
manager##58691
company##95001
date-create##01.04.18 06:00:00
date-status##                
canceled##N
comment##
manager-comment##Заказчик: Санкт-Петербург          kharlamov@me.com     Александр     +7 (921) 956-6692     /68475-1.0000шт(15581р)
order-fields##
basket##ID68475:1:15581
store##95001

в 1251
   Эльниньо
 
13 - 22.08.18 - 17:25
(10) Там 1251
   vova1122
 
14 - 22.08.18 - 17:27
(12) в первом примере нет русских букв, а во втором есть. Может дело в этом?
   Сияющий в темноте
 
15 - 22.08.18 - 17:27
idonec##0495Ê06605 - вот это что за символ и откуда - его в Windows 1251 просто нет - и здесь нет ни одного символа в Windows-1251, я так понимаю, что они превратились в пробелы.

А текст сам формируется в 1С или получается откуда-то (например, из базы данных по OLE и т.п.) ?
   Сияющий в темноте
 
16 - 22.08.18 - 17:28
Очень похоже, что "умная" Windows сама определяет кодировку по первому символу выше Ascii, а потом в неё конвертит весь файл.
   Эльниньо
 
17 - 22.08.18 - 17:30
(15) Это символ К (русская) так в 1252 записывается
   Эльниньо
 
18 - 22.08.18 - 17:31
(16) Вот и я думаю, что разрабы клюшек в середине 90-х не рассчитывали на такую умную винду.
Но мне от этого не легче
   Сияющий в темноте
 
19 - 22.08.18 - 17:31
(17) Выбери в Far-е явно кодировку Windows-1251 и открой этот файл. Он у тебя записан правильно, просто Far не может определить кодировку, так как нет русских слов.
   Сияющий в темноте
 
20 - 22.08.18 - 17:32
В открытом на просмотр файле в Far нажать Shift+F8 и выбрать кодировку.
   Сияющий в темноте
 
21 - 22.08.18 - 17:33
Далее, что не устраивает получателя файла ? Или он тоже в Far-е принимает ?
   Эльниньо
 
22 - 22.08.18 - 17:40
(21) Были файлы, которые выгрузились в 1255
И...!
В Фаре по Shift+F8 в списке кодировок не 1251
1250 и сразу после неё 1252
   Эльниньо
 
23 - 22.08.18 - 17:41
(22) "не 1251" = "нет 1251"
   Сияющий в темноте
 
24 - 22.08.18 - 17:45
У тебя в Far-е вверху список кодировок System, там 866 и 1251, а остальные в списке.
   Эльниньо
 
25 - 22.08.18 - 17:48
(24) Посмотрел файл, записавший в 1252 в кодировке 1251.
Кразозябры стали буквами
   Сияющий в темноте
 
26 - 22.08.18 - 17:50
(25) Я тебе об этом и говорю, что тупит Far.
   Сияющий в темноте
 
27 - 22.08.18 - 17:51
Вот простой сценарий на VbScript, который выводит коды символов из файла - можно смотреть, что там было.

Set Fso=CreateObject("Scripting.FileSystemObject")
Set a=WScript.Arguments
If a.Length<>2 Then
    WScript.Echo "Неверное число аргументов:" & CStr(a.Length)
    WScript.Quit
End If
Set r=Fso.OpenTextFile(a.Item(0),1,False,False)
Set w=Fso.CreateTextFile(a.Item(1),False,False)
q=0
Do
    If r.atEndOfStream=True Then Exit Do
    s=r.Read(1)
    k=Asc(s)
    w.Write CStr(k)
    q=q+1
    If q<16 Then
        w.Write vbTab
    Else
        w.Write vbCrLf
        q=0
    End If
Loop
w.Close
r.Close
WScript.Echo "Выполнено" & a.Item(0) & "=>" & a.Item(1)


Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Рекламное место пустует