Страницы

Поиск по вопросам

Показаны сообщения с ярлыком кодировка. Показать все сообщения
Показаны сообщения с ярлыком кодировка. Показать все сообщения

суббота, 11 апреля 2020 г.

Ошибка при копировании больших объемов данных (Ubuntu)

#windows #ubuntu #кодировка #сеть

                    
Возникла такая проблема, копирую файлы с винды по локальной сети, около 1 млн файлов
весом в 200Гб (простым способом, наутилусом).
После того как скопировалось 411242 файлов 26,6Гб (это последняя попытка) система
зависает, и выдает какие-то кракозябры на черном экране, среди которых можно найти
sdb1 - это сам винт (4Тб HDD). Смонтирован он в /mnt/sdb1/, фс ext4. Почем так происходит?
Ведь если копировать понемногу то все работает нормально. 

ЛОГИ dsmeg и syslog: http://rghost.ru/6Mqrjp4PN
    


Ответы

Ответ 1



возможно, в файловой системе закончились inode. посмотреть ситуацию по ним можно для всех примонтированных файловых систем командой df -i. пример вывода (в пятом столбце — процент использованных inode): $ df -i Filesystem Inodes IUsed IFree IUse% Mounted on /dev/dm-0 920272 207134 713138 23% / udev 497545 440 497105 1% /dev tmpfs 499982 769 499213 1% /run tmpfs 499982 3 499979 1% /dev/shm tmpfs 499982 7 499975 1% /run/lock tmpfs 499982 14 499968 1% /sys/fs/cgroup /dev/sda1 124496 335 124161 1% /boot tmpfs 499982 9 499973 1% /run/user/1000 для конкретной файловой системы можно указать точку монтирования (у автора — /mnt/sdb1): $ df -i /mnt/sdb1 или, даже если файловая система не примонтирована, с помощью команды sudo tune2fs -l /dev/sdb1 | grep -i inode. пример вывода: Filesystem features: has_journal ext_attr resize_inode dir_index filetype needs_recovery extent flex_bg sparse_super large_file huge_file uninit_bg dir_nlink extra_isize Inode count: 920272 Free inodes: 713166 Inodes per group: 8144 Inode blocks per group: 509 First inode: 11 Inode size: 256 Journal inode: 8 First orphan inode: 1863 Journal backup: inode blocks обратить следует внимание на inode count и free inodes. к сожалению, после создания файловой системы ext* уже невозможно изменить количество inode в ней. надо пересоздавать файловую систему (предварительно сохранив куда-нибудь всё её содержимое), указав, например, другой тип использования файловой системы. задать тип можно параметром -T usage-type программы mkfs.ext4. список типов можно посмотреть в /etc/mke2fs.conf. очень большое количество inode будет создано, например, для типа news (чем меньше inode_ratio, тем больше inode будет создано, а файловая система будет разбита на большее количество «кусочков» меньшего размера). а можно, не указывая тип использования, передать программе mkfs.ext4 непосредственно желаемый inode_ratio с помощью параметра -i. например, так: $ sudo mkfs.ext4 -i 4096 /dev/sdb1 предупреждение: только не увлекайтесь уменьшением inode_ratio: каждый inode «отбирает» несколько байт (задаётся с помощью inode_size, который лучше самому не изменять) «полезной ёмкости» для «служебной» информации.

вторник, 31 марта 2020 г.

Почему добавляются непонятные символы в БД при вводе русских букв (кириллицы) в phpMyAdmin?

#кодировка #utf_8 #кириллица


На странице, в которой ввожу данные, кодировка текста "< meta charset="utf-8>". Ввел
строку "Главная"



Вывод на другой странице выглядит так:



В БД кодировка - utf8_general_ci, а запись этих строк выглядит вот так:


    


Ответы

Ответ 1



Скрипт, который пишет в БД, не установлена кодировка обмена с mysql. В итоге скрипт пишет в БД в кодировке по умолчанию (скорее всего Latin). Поскольку и читает он в этой же кодировке, то на сайте все отображается как надо, а вот в phpMyAdmin, настроенном на utf8, вы видите "кракозябры". В скрипте, после соединения с БД надо выполнить запрос SET NAMES utf8 чтобы установить нужную кодировку обмена с БД

понедельник, 30 марта 2020 г.

Проблема с кодировками

#java #кодировка #поток_ввода #filewriter


Имеется утилита, которая запускает батники, которые в свою очередь собирают инфу
с помощью утилиты wmic и потом с них форматирует отчет на рабочий стол. 

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

К слову к примеру если в строку я записываю кириллицу сам, то всё ок. Проблема только
с файлом. Вот 1 из методов.

void networkAdapterGet() {
    StringBuilder result = new StringBuilder();
    try(BufferedReader reader = new BufferedReader(new FileReader(NETWORK_ADAPTER_INFO_PATH));
        BufferedWriter writer = new BufferedWriter(new FileWriter(TEMP_RESULT_FILE_PATH,
true))) {
        line = reader.readLine();
        while (line != null){
            if (line.length() > 1){
                line = trimSpaces(line);
                line = networkAdapterProcessing(line);
                if (!line.equals("")){
                    result.append(line);
                    result.append(lineSeparator);
                }
            }
            line = reader.readLine();
        }
        writer.write("Сетевые устройства:");
        writer.write(lineSeparator);
        writer.write(result.toString());
        writer.write(lineSeparator);
        writer.write(lineSeparator);
    } catch (IOException e) {
        e.printStackTrace();
    }
}


Скорее всего зря повелся наFileReader/Writer и думаю основная проблема, как раз таки
в Reader'е. Пошаманил с кодировками на открытии и получил фигу, упало как раз таки
из-за несовпадения кодировок, можно конечно перебрать вариантов там пара всего, но
хотелось бы узнать можно ли как-то это дело исправить. Это пока единственный мешающий/раздражающий
баг на данном этапе разработки утилитки.
    


Ответы

Ответ 1



Нужно писать в той кодировке, которая читается клиентом. Чтобы указать кодировку надо заменить FileWriter на new OutputStreamWriter(new FileOutputStream(TEMP_RESULT_FILE_PATH), StandardCharsets.UTF_8); если кодировка UTF_8 не подходит, то можно попробовать KOI-8 или CP1251, или другая кодировка, которая поддерживает кирилицу, например CP866.

Ответ 2



Очень помог ответ, Roman C. Получилась немного громоздкая конструкция со всеми этими обертками, но вроде бы работает осталось поправить другой метод, а именно networkAdapterProcessing(), чтобы корректно отображался результат, да и остальные методы можно оставить без изменений потому, что проблема только в сетевых устройствах, но вот решение самой проблемы с кодировками получилась весьма интересной хотя бы для меня, я еще пока только учусь. try(BufferedReader reader = new BufferedReader( new InputStreamReader( new FileInputStream(NETWORK_ADAPTER_INFO_PATH), "Unicode")); BufferedWriter writer = new BufferedWriter( new OutputStreamWriter( new FileOutputStream(TEMP_RESULT_FILE_PATH, true), "Unicode"))){ Так вот для того, чтобы определить кодировку достаточно было открыть файл клятым блокнотом и жамкнуть "Сохранить как", чтобы убедиться в том, что это Юникод. Причем пробовал вначале пересохранить в UTF-8, но там была полная борода. Сейчас конечно из-за того, что открывает с помощью другого инструмента сменилась и сама структура получаемой строки немного, но это уже мелочи по сравнению с раздражающей меня ошибкой с кодировкой. Как это у меня обычно и бывает проблема была в сути своей совсем не сложной, но мозги она заклинила неслабо. В будущем думаю исправлю, чтобы было все одинаково и не выделялось, но пока надо сделать хотя бы это. Спасибо вам за помощь.

воскресенье, 29 марта 2020 г.

Преобразование из String в массив байтов и обратно

#java #кодировка #потоки_данных


Написал на Java следующую последовательность действий:


Получаю из строки с кириллицей массив байтов

byte[] bytes="новая строка".getBytes();

Получается следующий массив: 

[-19, -18, -30, -32, -1, 32, -15, -14, -16, -18, -22, -32]
Передаю его на вход классу ByteArrayOutputStream

ByteArrayOutputStream baos=new ByteArrayOutputStream();
baos.write(bytes);

Выполняю обратное преобразование из массива байтов в строку

System.out.println(baos.toString());

Программа выводит в консоль текст новая строка


Вопрос: так как кириллица в юникоде имеет кодепойнты, превышающие 1 тысячу (кодепойнт
буквы А, к примеру, равен 1040), а байт в Java может принимать значения от -128 до
127, следовательно при попытке преобразовать строку в массив типа byte должна происходить
потеря информации, как следствие - при вызове метода toString() строка должна восстановиться
некорректно. Но этого не произошло. В чем тут причина?
    


Ответы

Ответ 1



Это не юникод. String.getBytes() использует кодировку по-умолчанию платформы: Encodes this String into a sequence of bytes using the platform's default charset, storing the result into a new byte array. Кодировка по-умолчанию задается настройками Java, ее можно проверить с помощью: System.getProperty("file.encoding"); Для получения байтов в юникоде, задайте кодировку явно: byte[] bytes="новая строка".getBytes("UTF-8"); Получится больше 12 байтов. Обновление по вопросам в комментарии: Разве UTF-8 выдает байты, эквивалентные юникодовскому представлению? У юникода бывают разные представления. UTF-8 — одно из них. Я знаю, что char выдает кодепойнты юникода. Если вывести System.out.println((byte)'н'), то это будет равно 61. Здесь можно посмотреть как строчная кириллическая «н» представляется в разных кодировках: https://unicode-table.com/en/043D/ UTF-8: Десятичное значение: 53437 Байты: 208 189 UTF-16BE: Десятичное значение: 1085 Байты: 4 61 Для char в Java, согласно спецификации (§3.1 Unicode) используется кодировка UTF-16. Это тоже двухбайтовая кодировка. Соответственно, когда Вы приводите char к byte Вы получаете младший байт в этой кодировке. Получить байты в "UTF-16BE" можно так: byte[] bytes="новая строка".getBytes("UTF-16BE"); Если вывести байты, как Вы предложили byte[] bytes="новая строка".getBytes("UTF-8"), то там первый байт равен -48, а не 61. Кодировка UTF-8, как указано ранее беззнаковые (от 0 до 255) байты: 208 и 189. Знаковые байты, соответственно, -48 и -67.

вторник, 17 марта 2020 г.

Церковнославянская раскладка в Ubuntu

#ubuntu #кодировка #клавиатура #локаль


Необходимо набирать текст на церковнославянском языке. Как мне это сделать?    


Ответы

Ответ 1



Церковно-славянский в LinuxКак установить церковнославянские шрифтыМетоды реализации церковно-славянского письма в компьютерных системахДля разработчиковЦерковнославянский язык в Линуксе

воскресенье, 8 марта 2020 г.

C++ UTF-8 в CP866

#cpp #кодировка #visual_cpp #перекодировка


Пишу библиотеку для принтера. На вход подается текст в формате UTF-8. Принтер печатает
кириллицу в формате CP866(кириллица). Как преобразовать UTF-8 в CP866? Возможно есть
специальные функции?
    


Ответы

Ответ 1



ifstream file("text.txt"); char pszCode[30]; file.getline(pszCode, 30); BSTR bstrWide; char pszAnsi[50]; int nLength; char* text = ""; nLength = MultiByteToWideChar(CP_UTF8, 0, pszCode, strlen(pszCode) + 1, NULL, NULL); bstrWide = SysAllocStringLen(NULL, nLength); MultiByteToWideChar(CP_UTF8, 0, pszCode, strlen(pszCode) + 1, bstrWide, nLength); nLength = WideCharToMultiByte(CP_OEMCP, 0, bstrWide, -1, NULL, 0, NULL, NULL); WideCharToMultiByte(CP_OEMCP, 0, bstrWide, -1, pszAnsi, nLength, NULL, NULL); SysFreeString(bstrWide); cout << pszAnsi << endl; В общем использовал в этот метод, как посоветовал VladD, в принципе все работает, хотя конечно я так и не понял, как работают эти две функции до конца. Но все равно спасибо!

суббота, 7 марта 2020 г.

.c_str() возвращает какой-то бред

#cpp #кодировка #visual_cpp #char


День добрый! На C++ считываю данные из файла. В конце имею string, которую мне надо
представить в виде const char*, для чего использую .c_str(). Но возвращает он какой-то
бред (не только с кириллицей проблемы, а вообще с любым текстом). Файл сохранены в
кодировке ANSI. Как можно решить проблему?
Код чтения:

ifstream ifs(path);
if (ifs.is_open())
{
    string s;
    s.assign((istreambuf_iterator(ifs.rdbuf())), istreambuf_iterator());
    cout << s;
    ifs.close();
    return s.c_str();
}
else
    return "";

    


Ответы

Ответ 1



Ну, начнем с того, что вы возвращаете указатель локального объекта, который после вашего return уничтожается, и указатель указывает... куда? Дальше не пояснять?

пятница, 6 марта 2020 г.

Проблемы с кодировкой на ideone

#cpp #кодировка #ideone


Как известно, ideone компилирует исходники на Си++ в utf8. Однако, мне нужна строка
в utf16 (wstring). Попытался сконвертировать, но получилось что-то не то (причём конвертация
из wstring в utf8 работает верно):

wstring_convert < codecvt_utf8_utf16 , wchar_t> convert;

const char *s = "еёЁжикЕст";
wstring str = convert.from_bytes(s);

for (int q=0; s[q]; ++q) cout << (int)s[q] << ' ';
cout << endl;
for (int q=0; q "%" + (x & 255).toString(16)).join("")
)

console.log(s)
console.log(s.split("").map(ch => ch.charCodeAt(0)).join(" "))




К тому же, если сделать 

wchar_t bin[] = {1077, 1105, 1025, 1078, 1080, 1082, 1045, 1089, 1090, 0};
str = bin;
cout << convert.to_bytes(str.c_str()) << endl;


то вывод верный.

Код полностью: http://ideone.com/ut7Nsg
    


Ответы

Ответ 1



Однако, мне нужна строка в utf16 (wstring). Это неверно, кодировка std::wstring в стандарте не указана, на Windwows/MSVC sizeof(wchar_t) 2, и там кодировка utf-16, на Linux/gcc sizeof(wchar_t) 4 и кодировка utf-32, ideone использует gcc, отсюда очевидные проблемы, переносимый способ получить код в utf-16 (c++11): #include #include #include #include int main() { std::wstring_convert < std::codecvt_utf8_utf16, char16_t> convert; const char *s = "еёЁжикЕст"; std::cout << "Input: " << s << "\n"; std::u16string str = convert.from_bytes(s); for (int q=0; s[q]; ++q) std::cout << (int)s[q] << ' '; std::cout << '\n'; for (int q=0; q

среда, 26 февраля 2020 г.

Как кодировались данные на перфокарту?

#кодировка


Такой вопрос - подскажите как кодировались данные на перфокарту? Какой-нибудь простой
пример.

Гугл выдает много публикаций, но большинство из них пересказывает общую информацию
из Википедии не углубляясь в детали. В других есть какие-то картинки, но они непонятные.
Я из поколения next, так что не застал то время)) и вот теперь хочу разобраться.
    


Ответы

Ответ 1



Буквы кодируются по алфавиту двумя проколами, цифры по порядку одним проколом. Спецсимволы (кроме &-/) тремя проколами. На карте помещается 80 символов, номера проставлены сверху и снизу между строк. Виртуальный кодер и ридер: http://masswerk.at/keypunch http://masswerk.at/cardreader На схеме: слева номера рядов, верхний ряд без номера - кодируемый символ х - прокол В двоичном режиме один прокол это 1 в бите. Машины использовали разный размер слова (бит в слове). На 36-битной машине на карту помещалось 2 команды процессора.

вторник, 25 февраля 2020 г.

Проблема с парсингом русских букв в Android

#xml #android #кодировка #java


Есть xml. Его парсю через андройд апликэйшн. Всё получается, если английский язык.
Но если поменять в xml - на русский язык, то при отображении страницы в android api
- символы отображаются некорректно. Испробовал поменять кодировку в xml  с utf-8 на
windows-1251. Не помогло. Пробовал заставить апликацию понимать кодировку -          

InputSource is = new InputSource();
is.setCharacterStream(new StringReader(xml));
is.setEncoding ("windows-1251");    
doc = db.parse(is);

Ничего не выходит. Может, кто сможет подсказать. Если надо больше исходника - выложу...
is.setEncoding("UTF_8");

тоже ничего не выходит
Посмотрел в вики: кракозябры. 
Сравнил кракозябры. Если мы ставим в xml, который парсим, кодировку 1251, то крокозябры
как будто идёт перекодировка из 1251 в 1252. Если мы ставим в xml кодировку utf-8,
то крокозябры выглядят, как будто перекодируем из utf в 1252. В чём может быть проблема?    


Ответы

Ответ 1



HttpResponse httpResponse = httpClient.execute(httpPost); HttpEntity httpEntity = httpResponse.getEntity(); line = EntityUtils.toString(httpEntity, "UTF-8"); Это ответ!

Ответ 2



Проверьте кодировку самого XML файла, он должен быть в UTF-8. Android по умолчанию использует кодировку UTF-8, так что данные должны лежать в UTF-8, а иначе надо перекодировать.

воскресенье, 9 февраля 2020 г.

Кракозябры при записи в файл скаченной html страницы

#html #python #кодировка #requests


Когда я качаю и сохраняю файл, у меня выводит некие символы типа "\x80\xe2\x94\x80\xe2\x94\x80". 

Как я понял, тут проблема с кодировкой. Как это можно исправить? Заранее спасибо.

import requests
headers = {
    'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:45.0) Gecko/20100101
Firefox/45.0'
}

url = 'https://ru.dotabuff.com/players/415673590/matches/' 
r = requests.get(url, headers=headers)

with open('test.html', 'w') as output_file:
    output_file.write(str(r.text.encode('UTF8')))

    


Ответы

Ответ 1



\xe2\x94\x80 — это текстовое представление байт в Питоне. Байты - перевод из строки: >>> '\u2500'.encode() b'\xe2\x94\x80' то есть байты: 226, 148, 128 записаны, используя экранирующие последовательности ascii символов \ x h h: \xe2, \x94, \x80 (т.к. 22610 = e216, 14810 = 9416, 12810 = 8016). ─ (U+2500) символ кодируется в utf-8 кодировке последовательностью октетов: 226, 148, 128. Вы их видите как \xe2\x94\x80 из-за str(text.encode()) в коде в вопросе (это ошибка, не следует так делать). Текстовое представление байт (repr) полезно при отладке. На диск следует писать либо сами байты (файл должен быть открыт в двоичном режиме: 'wb') как показано в @gil9red ответе, либо использовать текстовый интерфейс ('w' режим и подходящий для документа encoding параметр). Чтобы гарантировать, что html записан на диск в utf-8 кодировке в самосогласованном виде вне зависимости в какой кодировке сайт возвращает html, можно BeautifulSoup использовать. В вашем случае, сайт уже html в виде utf-8 возвращает и в самом содержимом

Ответ 2



Мне кажется лучшим вариантом сохранить данные без преобразования кодировок. Для этого открываем файл в бинарном режиме и записываем байтовый массив html страницы: with open('test.html', 'wb') as f: f.write(r.content)

суббота, 8 февраля 2020 г.

Функция mail(): трудности с кодировкой

#email #php #кириллица #utf_8 #кодировка


Всем доброго времени!  
Когда все было в windows-1251, все работало нормально. Иероглифы в письме появились,
после того как перевел все на utf-8.
Коды скриптов в utf-8, в html head meta http-equiv="Content-Type" content="text/html;
charset=utf-8".
Похожие темы гуглил, ничего пока не помогло. Использовать в поле From латиницу не
предлагать, т.к. нужна кириллица.
Когда письмо приходит на почту, то в общем списке писем, в поле от кого, кириллица
отображается корректно. Когда заходишь в само письмо, тот же текст в поле от кого,
корректно отображаются только латинские буквы и e-mail отправителя, кириллица выводится
иероглифами. Жирным выделено то, что смущает, в общем списке все нормально, значит,
я отправляю все правильно, но почему в самом письме все меняется?
Также пробовал варианты:

'subject' = '=?koi8-r?B?'.base64_encode(convert_cyr_string("Новое сообщение", "w","k")).'?=';  
'subject' = '=?utf-8?B?'.base64_encode(convert_cyr_string("Новое сообщение", "w","k")).'?=';  
'subject' = '=?koi8-r?B?'.base64_encode("Новое сообщение").'?=';  
'subject' = '=?utf-8?B?'.base64_encode("Новое сообщение").'?=';

На From никак не повлияло.
Код php:

 "tomail@site.ru",  
'subject' => "Новое сообщение",  
'message' => "

Текст сообщения

", 'headers' => "MIME-Version: 1.0\r\n"."Content-type: text/html; charset=utf-8\r\n"."From: Эта кириллица выводится иероглифами \r\n"); mail($mail['to'], $mail['subject'], $mail['message'], $mail['headers']);


Ответы

Ответ 1



Спасибо Stuf, последний комментарий натолкнул на ответ. Подстановки в subject никак не помогли, а вот конвертация только header все решила. Решил следующим образом: "tomail@site.ru", 'subject' => "Новое сообщение", 'message' => "

Текст сообщения

", 'headers' => "MIME-Version: 1.0\r\n"."Content-type: text/html; charset=utf-8\r\n"."From: Эта кириллица выводится иероглифами \r\n"); mail($mail['to'], $mail['subject'], $mail['message'], iconv ('utf-8', 'windows-1251', $mail['headers']));

Проблема с кодировкой windows-1251 на linux

#java #linux #кодировка #groovy


Читаю txt-файлы в java/groovy в кодировке WINDOWS-1251.

Часть файлов читается успешно, но один файл из 1С читается успешно только под windows,
а под linux кодировка обрабатывается неверно. 

Код чтения из файла Groovy

  String fileEncoding = "cp1251"
  file.eachLine(fileEncoding) { line -> esvData << line.split('=')
    System.out.println(line)}


В логе на Windows видны русские буквы, а на i686-redhat-linux(6.0) лог имеет следующий вид:


  1CClientBankExchange
  ВерсияФормата=1.02
  РљРѕРґРёСЂРѕРІРєР°=Windows
  Отправитель=
  Получатель=
  ДатаСоздания=23.03.2015
  ВремяСоздания=01:46:15
  ДатаНачала=20.03.2015
  ДатаКонца=20.03.2015
  РасчСчет=407028


При этом файлы в кодировке windows-1251 из других источников обрабатываются успешно
на том же linux.

В чем-то, кроме кодировки, может быть разница? Слышал, что могут присутствовать какие-то
доп. символы в начале файла.

package com.peterservice.pays.filepay.camel.processors.inscriptproc;

import com.peterservice.pays.filepay.camel.processors.InScriptProc;
import com.peterservice.pays.filepay.enums.CamelProperties;
import com.peterservice.pays.filepay.enums.Directories;
import com.peterservice.pays.filepay.model.Pay;
import com.peterservice.pays.filepay.model.PayRoute;
import org.apache.camel.Exchange;
import org.apache.camel.impl.DefaultCamelContext;
import org.apache.camel.impl.DefaultExchange;
import org.junit.Assert;
import org.junit.Ignore;
import org.junit.Test;

import java.io.File;
import java.math.BigDecimal;
import java.util.HashMap;
import java.util.Map;

/**
 * Created by Yuriy.Vinogradov on 06.08.2015.
 */
public class InScriptProc1CTest {

    @Test
    public void test() throws Exception {
        InScriptProc processor = new InScriptProc();
        Exchange exchange = prepareExchange();
        processor.process(exchange);
        Pay[] payments = exchange.getIn().getBody(Pay[].class);
        Assert.assertEquals(256, payments.length);
        for (Pay payment : payments) {
            if (payment.number.equals("549")) {
                Assert.assertEquals(new BigDecimal("0.4"), payment.amount);
                Assert.assertEquals("2015-03-20", payment.inDate);
                Assert.assertEquals("770fgh320", payment.INN);
                Assert.assertEquals("770fhh001", payment.payerKpp);
                Assert.assertEquals("401058fgh000fh79", payment.payerAccount);
                Assert.assertEquals("УФК по г.Москве (ФКУ \"Дирекция космодрома \"Восточный\")",
payment.payerTitle);
                Assert.assertEquals("25904fgh2221 0373fg910 Опл.  за услуги сот.связи
за декабрь2014, дог.от 12.12.14  №2350948, сч.14-1 от 26.12.2014, акт  DV03/70761371/28
 от 26,12,2014 , в т.ч. НДС-0,06 (л/с 15fg925)", payment.paymentReason);
            } else if(payment.number.equals("701")) {
                Assert.assertEquals(new BigDecimal("1.79"), payment.amount);
                Assert.assertEquals("2015-03-20", payment.inDate);
                Assert.assertEquals("2815fff915", payment.INN);
                Assert.assertEquals("27fff1001", payment.payerKpp);
                Assert.assertEquals("30302810fffh0000100", payment.payerAccount);
                Assert.assertEquals("ФКП \"Аэропорты Дальнего Востока\" р/с 40502810409fghfh001
в ХФ ОАО \"МДМ БАНК\"  г Хабаровск", payment.payerTitle);
                Assert.assertEquals("УИНО///Оплата по сч-фак. №10010687719/800 от
28.02.2015 л/счет 1fgh4543. Сумма 1-79 В т.ч. НДС  (18%) 0-27", payment.paymentReason);
            } else if(payment.number.equals("822")) {
                Assert.assertEquals(new BigDecimal("50"), payment.amount);
            }else{
           //     Assert.fail("Not expected document number:" + payment.number +
" Check if it is correct and create if branch for this document number");
            }
        } 
    }

    private Exchange prepareExchange() {
        Exchange exchange = new DefaultExchange(new DefaultCamelContext());
        PayRoute payRoute = new PayRoute();
        exchange.getIn().setBody(payRoute);
        payRoute.setInScript("src/scripts/1c-java.groovy");
        Map resultDirs = new HashMap<>();
        resultDirs.put(Directories.ERROR.title, "test/" + Directories.ERROR.title
+ "/dir/");
        resultDirs.put(Directories.GF.title, "test/" + Directories.GF.title + "/dir/");
        resultDirs.put(Directories.LG.title, "test/" + Directories.LG.title + "/dir/");
        resultDirs.put(Directories.UNDEFINED.title, "test/" + Directories.GF.title
+ "/dir/");
        resultDirs.put(Directories.LOG.title, "test/" + Directories.LOG.title + "/dir/");
        payRoute.setResultDirs(resultDirs);
        exchange.setProperty(CamelProperties.ProcessingFile.title, new File("src/test/resources/sberbank_27_20150320_1.txt").getAbsoluteFile());
        return exchange;
    }
}


hexdump  для проверки начала файла на bom

[relstand@srv3-amain-a test]$ hexdump -C sberbank_27_20150320_1.txt | head
00000000  31 43 43 6c 69 65 6e 74  42 61 6e 6b 45 78 63 68  |1CClientBankExch|
00000010  61 6e 67 65 0d 0a c2 e5  f0 f1 e8 ff d4 ee f0 ec  |ange............|

    


Ответы

Ответ 1



вы применили лишнюю перекодировку «из cp1251 в utf8», в чём несложно убедиться, выполнив обратную перекодировку: $ echo '1CClientBankExchange ВерсияФормата=1.02 РљРѕРґРёСЂРѕРІРєР°' | iconv -f utf8 -t cp1251 1CClientBankExchange ВерсияФормата=1.02 Кодировка читайте этот файл «как есть», без каких-либо перекодировок. Слышал, что могут присутствовать какие-то доп символы в начале файла? да, это называется bom. убедиться в их наличии/остутствии можно, например, так: $ hexdump -C путь.к.исследуемому.файлу | head 00000000 70 61 63 6b 61 67 65 20 63 6f 6d 2e 70 65 74 65 |package com.pete| 00000010 72 73 65 72 76 69 63 65 2e 70 61 79 73 2e 66 69 |rservice.pays.fi| 00000020 6c 65 70 61 79 2e 63 61 6d 65 6c 2e 70 72 6f 63 |lepay.camel.proc| 00000030 65 73 73 6f 72 73 2e 69 6e 73 63 72 69 70 74 70 |essors.inscriptp| 00000040 72 6f 63 3b 0a 0a 69 6d 70 6f 72 74 20 63 6f 6d |roc;..import com| 00000050 2e 70 65 74 65 72 73 65 72 76 69 63 65 2e 70 61 |.peterservice.pa| 00000060 79 73 2e 66 69 6c 65 70 61 79 2e 63 61 6d 65 6c |ys.filepay.camel| 00000070 2e 70 72 6f 63 65 73 73 6f 72 73 2e 49 6e 53 63 |.processors.InSc| 00000080 72 69 70 74 50 72 6f 63 3b 0a 69 6d 70 6f 72 74 |riptProc;.import| 00000090 20 63 6f 6d 2e 70 65 74 65 72 73 65 72 76 69 63 | com.peterservic| обновление а ещё парсер, теоретически, может «сбиваться» из-за разных окончаний строк. распространённых вариантов как минимум три: cr lf cr + lf для изменения этих символов в операционной системе gnu/linux можно воспользоваться программами (из пакета dos2unix, присутствующего в репозиториях всех популярных дистрибутивов): dos2unix unix2dos unix2mac mac2unix вызов (для замены пары cr + lf на lf): $ dos2unix путь.к.файлу

Ответ 2



Это не win-1251. Так выглядит Юникод, ошибочно принятый за win-1251. Вот вам картинка-подсказка по распознаванию кодировок: https://hsto.org/files/d77/1c6/054/d771c60540c44bc984641c337fd099f0.png

среда, 5 февраля 2020 г.

Python проблемы с кодировкой при скачивании html с помощью requests

#html #python #python_3x #кодировка #requests


Пытаюсь спарсить страницу http://mezgil.kz/. Python 3. Получаю кракозябры типо таких:


Код ниже, скрипт сохранен в utf-8. Я не знаю что может быть не так, ведь другие сайты
норм парсятся:

# -*- coding: utf-8 -*-
import requests

result = requests.get('http://mezgil.kz', timeout=30.0)
page = result.text
print(page)

    


Ответы

Ответ 1



import requests result = requests.get('http://mezgil.kz', timeout=30.0) result.encoding='utf-8' page = result.text print(page) Документация - http://docs.python-requests.org/en/master/user/quickstart/

Ответ 2



requests неверно кодировку ответа определил. Для r.text использовалась iso-8859-1 вместо правильной в этом случае utf-8, поэтому кракозябры напечатались. Сервер не указал кодировку в Content-Type http заголовке, поэтому requests выбрал кодировку по умолчанию для http iso-8859-1 (бесполезный и часто вредный выбор, основанный на устаревшей RFC 2616), не пытаясь посмотреть на html-содержимое ответа, в котором прописана другая кодировка . Разработчики объясняют это тем, что requests это http библиотека, а не html библиотека. Правила как именно кодировка должна быть указана (указывать ли в разных местах (как в Content-Type заголовке так и в html документе или только в html документе), что имеет приоритет, BOM, какая кодировка по умолчанию) менялись со временем. Сейчас html5 просто utf-8 требует: "The Encoding standard requires use of the UTF-8 character encoding". См. Require UTF-8. Поэтому можно жёстко прописать: response.encoding = 'utf-8' print(response.text) Если сайт использует какую-то другую кодировку, не указанную в http заголовке, то практичная опция это использование BeautifulSoup класса, специализированного для работы с html и который может поддерживать даже случаи когда документ представлен из смеси кодировок. См. A good way to get the charset/encoding of an HTTP response in Python.

Python - проблемы с кодировкой utf-8

#python #python_3x #apache #кодировка


Как заставить пайтон работать с кодировкой utf-8?

Генерируется файл file.pyc (или не генерируется, сам не понял) с win1251 заголовками
из utf file.py

Собственно исходный файл. Авось поможет.
Файл кодирован в utf-8 без BOM

#!/usr/bin/python
# -*- coding: utf-8 -*-
import string
import sys

print ('''Content-type: text/html''')
print ('''


Проверка Python


Русский текст - Nerusskii text
    ''') А в браузер я получаю страничку с хедерами Content-Type:text/html; charset=UTF-8 и содержимым. (Браузер смотрит в utf-8, а файл то win1251) �������� Python ������� ����� - Nerusskii text
      UP (Спустя много лет) Проблема таки оказалась в Apache. Решение нашлось туть AddDefaultCharset UTF-8 SetEnv PYTHONIOENCODING utf8


Ответы

Ответ 1



Попробуй добавить в шапку py ## -*- coding: utf-8 -*- И сохранить файл в utf-8.

Ответ 2



Собственно в какой программе пишется сам код? Вы пробовали проэксперементировать, например указать в заголовки кодировку как win1251. Так же возможно используемый шрифт в браузере ничего не знает о русских буквах в UTF (помню раньше в windows XP из за таких вот телодвижений, в прочим как и в Висте приходилось в системе жестко указывать шрифт, так как многие приложения не только не знали о русских но и о многих других языках.) Так же стоит попробовать жестко указать функции print о используемой кодировке для строки. Так же не совсем понятно куда выводит ваши сообщения функция print, возможно то что принимает вывод не знает о русских буквах. (когда "система" не знает о русских буквах и получает хотя бы букву в виде набора байт то разбивает ее на две (вспомните СМС, английскими символами написать вы можете больше чем русскими) и мы получаем 2 совершенно самостоятельных символа на выходе, а так как они существую, то естественно в дальнейшей обработке они и идут как 2 совершенно разных символа а не наша русская буква. хотя в вашем случае похоже это не совсем то, так как количество символов здесь не 2 раза больше, но думаю принцип вам понятен.)

воскресенье, 2 февраля 2020 г.

кириллица в термальном принтере

#java #кодировка #кириллица


взял код отсюда http://www.mets-blog.com/java-pos-thermal-printer-example/
там смущает вот эта строка 
bytes = text.getBytes("CP437");
в других кодировках крякозябры в общем как заставить печатать кириллицу?
    


Ответы

Ответ 1



Наверное все носители тайного знания как заставить печатать туповатый принтер кириллицу просто тупо вымерли и я остался один. А ведь были золотые времена в святые 90-е это была вообще золотая тема :) В принтере в евонной памяти содержится некая таблица, в которую загружены шрифты и где напротив байта - стоит его буквенное изображение. Когда принтеру приходит команда печатать байт, он берет байт с ним идет в таблицу извлекает оттуда символ и посылает сигнал своим головкам изобразить символ. Соответственно, задача прогера состоит в том, чтобы шрифты загруженные в память принтера получали правильные байты (кодировка) или же если нет шрифтов загрузить таковые в принтер. Обычно это задача драйвера - драйвер берет на себя эту непосильную задачу. Соответственно, задача распадается в нашем случае на 2 части: Загрузка шрифтов - зависит от модели принтера, обычно в мануале подробно описывается сей процесс (или решается тупо установкой драйвера). В тупых моделях принтеров бывает загружен только 1 шрифт с кодировкой CP-437 (US) Перекодировка байтов (если требуется - зависит от кодировки шрифта) В общем давайте модель принтера - оттуда и будем плясать. Update В мануале расписаны ESC коды управления принтером. По идее, это все должен делать драйвер, но можно и самому. Вам надо сначала перед печатью выставить кодовую страницу, что достигается следующей ESC последовательностью: ESC t n По простому надо в порт принтера записать три байта: 0x1B 0x74 0x11 //байты приведены в HEX (ESC t 17) После чего надо посылать ваш текст, но уже в кодировке KOI-8 Рекомендуется перед этим проинициализировать принтер посылкой команды ESC @

Ответ 2



Кодировка CP437 не содержит кирилицы. Если у вас символы кирилицы закодированны например в русскую кодировку CP1251 или КОИ-8, то на выходе у вас получится набор байт, который нельзя показать ввиду сказанного выше. Поэтому вам скорее всего надо декодировать в другую кодировку, содержащую кирилицу. Но возможен вариант трансфера где декодированные байты можно обратно закодировать с помощью того же CP437 и в результате у вас получится строка в прежней кодировке.

суббота, 1 февраля 2020 г.

Неверное отображение русских символов

#кодировка #java


Возникла необходимость работы через консоль с русским буквами. Код такой:

Scanner sc = new Scanner(System.in,"cp866");
System.setProperty("console.encoding","cp866");
PrintStream ps = new PrintStream(System.out);
ps.println("Введите условия задачи");
String taskText=sc.nextLine();
ps.println("Мы получили текст: "+taskText);


В результате у меня получается примерно следующее:

Введите условия задачи
на дворе трава, на траве дрова12
Мы получили текст: ?? ????? ?????, ?? ????? ?????12


С кодировками экспериментировал, не помогло.
    


Ответы

Ответ 1



Раз вопрос всплыл, отвечу на него. Ваша проблема в том, что "консоль" Netbeans - и консоль ОС - это немного разные вещи. В частности, у них отличаются используемые кодировки. Оптимальным было бы получение текущей кодировки консоли через Console API - но Java такого не предоставляет. Поэтому надо получить информацию о консольной кодировке другим способом. К примеру, через свойство console.encoding. Способ 1 Для начала, установка свойства console.encoding в предопределенное значение ничего не дает. Это свойство попросту никем не читается. Вместо того, чтобы ставить его в cp866, следовало бы, напротив, прочитать из него значение. String encoding = System.getProperty("console.encoding", "utf-8"); Scanner sc = new Scanner(System.in, encoding); PrintStream ps = new PrintStream(System.out, encoding); Таким образом, вместо того, чтобы ожидать ввода в cp866, программа позволяет запустившему ее указать любую кодировку (utf-8 - это кодировка по умолчанию. Замените ее на ту, которую использует консоль NetBeans). Запускать программу надо будет как-то так: java -Dconsole.encoding=cp866 ... На первый взгляд, такой способ запуска кажется сложным. Но обычно для запуска "серьезных" программ на Java всегда используется некоторый пакетный файл. Что мешает дописать этот ключ в него? И не забывайте, консоль в Windows может оказаться в любой кодировке! К примеру, некоторые программы, такие как reg.exe, умеют работать с консолью только в windows-1251. Умение выводить в любой кодировке может пригодиться. chcp 1251 reg ... java -Dconsole.encoding=windows-1251 ... Способ 2 Если уже заговорили про пакетные файлы, то есть более простой способ, хотя и не такой мощный. Можно просто сменить кодировку консоли на нужную перед запуском программы: chcp 1251 java ... Вот номера кодовых страниц Windows, которые могут пригодиться: 866 - cp866 1251 - windows-1251 65001 - кодировка utf-8 1200 - двухбайтовая кодировка utf-16 PS Помните, что System.in и System.out, как правило, всегда должны быть в одной и той же кодировке. У вас в исходной программе сканер читал из System.in в кодировке cp866 - а принтер выводил в System.out в кодировке по умолчанию. Такое несоответствие - тоже источник ошибок. Никогда так не делайте.

Ответ 2



Измените кодировку на UTF-8: Scanner sc = new Scanner(System.in,"utf-8"); System.setProperty("console.encoding","utf-8"); ... Отметьте, что кодировка UTF-8 используется по умолчанию. Можно просто писать так: Scanner sc = new Scanner(System.in); PrintStream ps = new PrintStream(System.out); ps.println("Введите условия задачи"); ...

среда, 29 января 2020 г.

Запрос строки из БД выводит нечитабельные символы вместо кириллических

#sql #oracle #кодировка #клиент


Пытаюсь в клиентской программе с помощью запроса к БД:

select 'АБВГДЕЙКА' from dual; 


вывести кирилические символы, но получаю или:  


  ??????????????????


, или квадратики, а так-же другие кракозябры.

Какие пути решения проблемы? 
    


Ответы

Ответ 1



TL;DR Почти без исключений проблема кроется в различных кодировках (charachter set) установленных в программе-клиенте (далее клиент) и в БД. Если кодировки не совпадают, то после получения символьных данных из БД в клиенте производится неявная перекодировка этих данных из кодировки установленной в БД в кодировку установленную в клиенте. Неверно установленная кодировка в клиенте приведёт к неверному отображению символов. Когда перекодировка в кириллицу возможна? Если кодировка в клиенте является подмножеством кодировки в БД, т.е. все символы кодировки на клиенте содержаться в кодировке БД. Например, если в БД установлены: US7ASCII (только 7-ь бит), EE8MSWIN1250 или EE8ISO8859P2 (восточноевропейские языки) и подобные им, то перекодировка невозможна. Многосимвольные кодировки: AL32UTF8, AL16UTF16 и т.п. - не должны вызывать проблем. Как узнать, какая кодировка установлена в БД? select value from nls_database_parameters where parameter = upper ('nls_characterset'); Как установить нужную кодировку в клиенте? Зависит собственно от клиента, но в большинстве случаев, т.к. используют одни и те же библиотеки доступа к БД (OCI, JDBC), действуют установки в следующей последовательности (последовательность важна, из нескольких последняя выиграет): (Только Windows) в реестре: HKLM\SOFTWARE\ORACLE\KEY_[Client_home1]: NLS_LANG=.CL8MSWIN1251 В переменной окружения NLS_LANG WIN: Свойствa системы -> Дополнительно -> Переменные среды или в командном интерпретере: set NLS_LANG=.CL8MSWIN1251 UNIX: ~/.profile или в терминале: export NLS_LANG=.CL8MSWIN1251 Программа-клиент может иметь свои собственные установки, которые перепишут все выше описанные. Значение NLS_LANG состоит из 3-х независимых друг-от-друга частей и имеет форму: language_territory.characterset, например NLS_LANG = AMERICAN_RUSSIA.CL8MSWIN1251. В данной теме интересна последняя часть после точки. Кодировка в клиенте установлена правильно, но увы, куда смотреть дальше? В программе или терминале не установлена поддержка кириллических символов. WIN: в командном интерпретере вывод chcp совпадает с желаемой кодировкой? Попробуйте изменить, например: chcp 1251 UNIX: проверте переменную окружения: env | grep LANG В программе могут быть специальные установки для поддержки различных кодировок, например в SQL Developer: Preferences -> (+) Environment -> Encoding: [ ... ] Установленный шрифт не поддерживает кириллические символы. Попробуйте заменить шрифт по-умолчанию. Кодировка в клиенте изменнена после того, как с предедущей кодировкой были произведены операци изменения (или вставки). Все измененые в БД данные, содержащие кириллические символы - "мусор". Удалите изменения и повторите их после установки правильной кодировки в клиенте. Подробнее в офф. документации.

вторник, 28 января 2020 г.

UTF8 строка, в нормальную .NET строку

#c_sharp #net #строки #кодировка


Я знаю как перекодировать строки, интересует следующее, какая стандартная кодировка
у строк .NET. Пробовал UTF-32LE, но символы не правильно отображаются.


  Вопрос не о перекодировании, а о кодировке строк .NET.



По просьбе добавлю код:

VlcTrackInfo(int id, string name)
{
    _id = id;

    Encoding utf8 = Encoding.UTF8;
    Encoding utf32 = Encoding.GetEncoding("UTF-32LE");
    byte[] text = Encoding.Convert(utf8, utf32, utf8.GetBytes(name));
    _name = utf32.GetString(text);
}


Если зациклить внимание на том что в .NET не важно какая кодировка у строки, то тут
думаю стоит внести поправку.

Строка которую я получаю, состоит не из wide символов, а из ansii, которые закодированы
в utf8 кодировку для поддержки извлечения wide символов. Т.е. если я к примеру, подключу
библиотеку к c++-cli проекту и буду перекодировать строку там, то при использовании
того же MultiByteToWideChar с указанием кодировки строки как CP_UTF8, я получу читаемую
строку (но каким-то образом остается 1 лишний символ). Так же при использовании std::wstring_convert>,
снова получаю нормальную читаемую строку.

На скриншоте видно, что testStringDotNet имеет ровно такое же значение, как и принятое
функцией входным параметром:



Если я правильно понимаю, то Encoding.GetBytes отдает массив байт как ubyte, но не
byte за счет чего и происходит неверное декодирование.
    


Ответы

Ответ 1



Слово "кодировка" применимо только при хранении строки как массива байт. Не может в string лежать UTF8 строка или ASCII строка. Т.к. UTF8 или ASCII, или любая другая кодировки - это то, как одни и те же символы записываются в виде разных байт. Но ведь в .net вы работаете с символами, а не с байтами. "A" в utf8 - это тот же символ что "A" в ASCII. Пока строка - это string - вам все равно, какие там внутри байты. Нет никакой "стандартной кодировки". Есть строка. Ее можно превратить в представление в виде байт в любой кодировке. Массив байт можно превратить строку, но для этого нужно указать кодировку для превращения байт в строку. То, что вы называете "перекодированием" строки - это костыль, который обычно применяют для "исправления строки" прочитанной с указанием неверной кодировки. И исправлять это нужно указанием верной кодировки при декодировании оригинального массива байт. Т.е. код выглядит как Есть массив байт Его преобразовали в строку, указав неверную кодировку. Где-то ниже по коду делается попытка "перекодировать" испорченную строку. То, что получается в 2, вы считаете "строкой в неверной кодировке". И поэтому пытаетесь узнать, какая же кодировка верная. И исправить неверную на верную в 3. На самом деле в 2 получилась просто строка. То, что в ней нечитабельный мусор - это последствия того, что вы не угадали с кодировкой при чтении массива байт. И чинить это нужно указанием в 2 той кодировки, в которой строка когда то была в эти байты сохранена. Т.е. проблема не в "кодировке строки", а в том, что вы не угадали с кодировкой массива байт том месте, где из него читается name. Вы, скорее всего, читали массив как utf8, но в байтах была строка в чем-то другом.

Ответ 2



Если вам приходит строка из неуправляемого кода, то принимайте ее как массив байт, а дальше делайте: string str = Encoding.UTF8.GetString(bytes)

воскресенье, 26 января 2020 г.

Не выводятся символы кириллицы в заголовках ноды

#drupal #кодировка


Подскажите как исправить, Drupal 7.8, шаблон govideo, в загаловках ноды страницы
выводится только символы юникода, хотя в коде страницы отображается все нормально.
nelegalom . . 1 - так выглядит на странице,

nelegalom по Чернобыльской зоне. Сталк с МШ. Часть1

- так в коде страницы Подскажите что изменить для отображения кириллицы? Обновление Посмотрел внимательно css, шрифты в норме, добавил чтоб наверняка Arial. В одном месте выводятся кириллические символы, код такой: content)) { print $fields['field_video']->content; } if (isset($fields['field_teaserimage']->content)) { print $fields['field_teaserimage']->content; } else { if (isset($fields['field_embeddedvideo']->content)) { print $fields['field_embeddedvideo']->content; }} ?> content; ?>


Ответы

Ответ 1



Я бы советовал вам найти в папке templat'a(шаблона) файл node.phtml(или как-то так, шаблон ноды) и перекодировать сам файл либо в utf-8 либо в windows-1251, например при помощи sublime или notepad++ или чем-то что умеет это делать. В зависимости от того, какая кодировка на всём сайте. п.с. Какой у вас template?