Страницы

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

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

четверг, 19 марта 2020 г.

Кодировка: UTF8 -> ANSI

#c_sharp #перекодировка


Столкнулся со следующей проблемой: есть файл в ANSI кодировке и я его считываю построчно,
но насколько я правильно понял, в C# эта считанная строка хранится в юникоде и в ней
я наблюдаю какие-то иероглифы. Что делаю я (на примере 1-ой строчки файла):
StreamReader read = new StreamReader(@"D:\(path)");

StreamWriter write = new StreamWriter(@"D:\(path)");

Encoding ANSI = Encoding.GetEncoding(1252);
Encoding UTF8 = Encoding.UTF8;
byte[] utf8_bytes,ansi_bytes;

utf8_bytes = UTF8.GetBytes(read.ReadLine());
ansi_bytes = Encoding.Convert(UTF8, ANSI, utf8_bytes);

string ansi_str = ANSI.GetString(ansi_bytes);

write.WriteLine(ansi_str);

read.Close();
write.Close();

Но это почему-то не работает: в новом файле все также отображается много непонятных
вопросительных знаков. Заранее спасибо.    


Ответы

Ответ 1



Посмотрите внимательнее на код: прочитать текст, записанный в файле в UTF-8 (по умолчанию для StreamReader) записать текст в UTF-16LE строке (класс System.String в .NET) получить представление текста в кодировке UTF-8 в виде массива байтов преобразовать текст из UTF-8 в ANSI, получая массив байтов преобразовать текст из кодировки ANSI в UTF-16LE для записи в System.String записать текст (который сейчас в System.String), используя StreamWriter (который по умолчанию пишет в кодировке UTF-8) Итого получается, что текст проходит следующие преобразования: UTF-8 (StreamReader) -> UTF-16LE (System.String) -> UTF-8 (byte[]) -> ANSI (byte[]) -> UTF-16LE (System.String) -> UTF-8 (StreamWriter) Думаю, что теперь стало очевидно, в чём проблема.

Ответ 2



StreamReader read = new StreamReader(@"D:\(path)"); StreamWriter write = new StreamWriter(@"D:\(path)"); Encoding ANSI = Encoding.GetEncoding(1251); Encoding UTF8 = Encoding.UTF8; byte[] utf8_bytes,ansi_bytes; utf8_bytes = UTF8.GetBytes(read.ReadLine()); ansi_bytes = Encoding.Convert(UTF8, ANSI, utf8_bytes); string ansi_str = ANSI.GetString(ansi_bytes); write.WriteLine(ansi_str); read.Close(); write.Close(); Попробуйте 1251 вместо 1252, тогда русские символы будут отображаться корректно.

воскресенье, 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, в принципе все работает, хотя конечно я так и не понял, как работают эти две функции до конца. Но все равно спасибо!

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

Как перегрузить оператор << у cout?

#операторы #перекодировка #cpp #библиотеки


В связи с этим вопросом решил задать другой, как оказалось, более важный вопрос.
В общем я недавно начал изучать C++ и поимел проблемы с кодировками, помогите мне
перегрузить << у std::cout чтобы он принимал строки в utf-8 а выводил в windows-866. 
    


Ответы

Ответ 1



Собственно, перегрузить сможете, только если будете передавать какой-то тип, отличный от string, char* и пр., поскольку << у cout уже перегружен для них. Можно просто создать функцию с такой вот примерно сигнатурой void printunicode (ostream&, const string&) В ней собственно переводите юникодное содержимое строки в нужную кодировку, записываете его в буфер, а его уже передаете потоку. Или даже проще. Создаете функцию, которая принимает строку с юникодом, а возвращает в нужной кодировке. Тогда можете ее использовать в череде операторов <<.

Ответ 2



Помню как заминусовали когда в прошлый раз ответил на свой вопрос но всё таки отвечу :) Понял что легче всего сменить кодировку файла на целевую (хорошо что я не японец :) ). В общем для Code::Blocks сделал так: 1) Скачал uniconv.exe (давно качал счас не помню где) 1a) Т.к. uniconv не поддерживает utf-8 поставил по умолчанию в code::blocks windows-1251 2) Добавил в Tools такой Tool: 3) И если работаю с D:\ProjectsC++\C++ Learning\Chapter 2\Homework\Ch2_Ex1.cpp: #include int main(){ using namespace std; cout << "Привет! " << endl << "Моё имя: Иван." << endl << "Моя фамилия: Черновалов."; cin.get(); return 0; } и вызываю tools=>reCHARSET WD то получаю D:\ProjectsC++\C++ Learning\Chapter 2\Homework\Ch2_Ex1.cpp.cpp в windows 866 затем вручную :( открываю его и вижу: #include int main(){ using namespace std; cout << "ЏаЁўҐв! " << endl << "Њ®с Ё¬п: €ў ­." << endl << "Њ®п д ¬Ё«Ёп: —Ґа­®ў «®ў."; cin.get(); return 0; } 4) Строю&Запускаю и ву-аля: Может кому поможет... PS: Как видите не могу получить (не создав Project) отдельно имя файла отдельно директорию поэтому приходится использовать двойное расширение чтобы отличать файлы (т.к ели изменять редактируемый файл то ошибка приложения) и приходится вручную открывать файл. Ещё в code::blocks есть Tools+ и Scripts но я не умею ими пользоваться если кто может помогите усовершенствовать мой "костыль" :) чтобы создавался временный файл компилировался с именем текущего и удалялся...

четверг, 2 января 2020 г.

Перевод строки в читабельный вид

#python #кодировка #email #перекодировка


Подскажите как перевести данную строку в читабельный вид:

=?windows-1251?Q?=EC=E5=ED=F2=2Etxt?=


Оригинал строки

мент.txt

    


Ответы

Ответ 1



Вам поможет модуль email.header import email.header a = "=?windows-1251?Q?=EC=E5=ED=F2=2Etxt?=" print email.header.decode_header(a) Приведеная вами строка закодирована согласно RFC2047. То есть формат строки такой: =?кодировка?признак типа кодирования?закодированная строка?= Признаков типа кодирования известно два Q и B. Соответственно они означают кодирование QuotedPrintable и Base64 соответственно. decode_header() принимает строку в формате RFC2047, распознает тип кодирования, декодирует и возвращает два параметра - декодированная строка и кодировка.

Ответ 2



import quopri a = '=EC=E5=ED=F2=2E' b = quopri.decodestring(a) print(b.decode('windows-1251'))

суббота, 7 декабря 2019 г.

Перевод с C++ на русский или C#

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


ДВС!
Помогите расшифровать фрагмент кода:

int s = [] (int n) { int i = 1; while(n--) i*=2; return i; }(n);


Что все это означает? особенно (n) и (int n) в круглых скобках после того как оно
уже было объявлено в программе ранее? Спасибо
    


Ответы

Ответ 1



На C#: int s = ((Func)(k => { int i = 1; while (k-- != 0) i *= 2; return i; }))(n); На русский: int s — объявить переменную s типа int... = — ...и инициализировать её значением, равным... [] — вот тут будет лямбда-функция, это типа функция, но записанная прямо здесь, а не отдельно (int n) — список аргументов функции — один int, назовём его n { — началось тело функции: int i = 1; — завели локальную переменную i, инициализировали значением 1 while(n--) i*=2; — пока n не равно 0, удвоить i; после каждой проверки уменьшить n return i; — вернуть i } — а это тело функции закончилось (n) — ...функцию вызываем с аргументом n, и результатом вызова инициализируем переменную s ; — конец объявления переменной s. (Спасибо @GreenDragon за уточнение!)

Ответ 2



это новые штуки с++ - лямбды. Перепишем на более простой и привычный с++ int foo(int n) { int i = 1; while (n--) { i*=2; } return i; } int s = foo(n); по факту - просто считает 2 в степени n для положительных чисел. Для отрицательных... а там все плохо:)

Кодировка текста в C# (CP1163)

#c_sharp #перекодировка #encoding


Есть определенный код который получает и выводит листинг из БД (MySQL).

Не могу одолеть один столбец, там данные (текст) лежат в кодировке cp1163.

Соответственно в листинге отображаются кракозябры.

Знатоки, подскажите пожалуйста  как можно  штатными средствами C#  перекодировать
полученное в cp1251. 

Пробовал указать set names при подключении, но MySQL не понимает такой кодировки.
    


Ответы

Ответ 1



Общий вид такой: var sourceEncoding = Encoding.GetEncoding(1163); var resultEncoding = Encoding.GetEncoding("windows-1251"); byte[] sourceBytes = utf8.GetBytes(text); byte[] resultBytes = Encoding.Convert(sourceEncoding, resultEncoding, sourceBytes); var result = resultEncoding.GetString(resultBytes); Только вот Code Page найти я не смог. Вот спецификация на CP1163, вы можете отнаследоваться от System.Text.Encoding и реализовать у него Convert, GetBytes.

Ответ 2



byte[] smthIn1163 = ...; string s = new string(Encoding.GetEncoding(1163).GetChars(smthIn1163)); Ну и Encoding лучше создать один раз, а не в цикле.

четверг, 11 октября 2018 г.

Перевод с C++ на русский или C#

ДВС! Помогите расшифровать фрагмент кода:
int s = [] (int n) { int i = 1; while(n--) i*=2; return i; }(n);
Что все это означает? особенно (n) и (int n) в круглых скобках после того как оно уже было объявлено в программе ранее? Спасибо


Ответ

На C#:
int s = ((Func)(k => { int i = 1; while (k-- != 0) i *= 2; return i; }))(n);
На русский:
int s — объявить переменную s типа int... = — ...и инициализировать её значением, равным... [] — вот тут будет лямбда-функция, это типа функция, но записанная прямо здесь, а не отдельно (int n) — список аргументов функции — один int, назовём его n { — началось тело функции:
int i = 1; — завели локальную переменную i, инициализировали значением 1 while(n--) i*=2; — пока n не равно 0, удвоить i; после каждой проверки уменьшить n return i; — вернуть i } — а это тело функции закончилось (n) — ...функцию вызываем с аргументом n, и результатом вызова инициализируем переменную s — конец объявления переменной s. (Спасибо @GreenDragon за уточнение!)

Кодировка текста в C# (CP1163)

Есть определенный код который получает и выводит листинг из БД (MySQL).
Не могу одолеть один столбец, там данные (текст) лежат в кодировке cp1163
Соответственно в листинге отображаются кракозябры.
Знатоки, подскажите пожалуйста как можно штатными средствами C# перекодировать полученное в cp1251.
Пробовал указать set names при подключении, но MySQL не понимает такой кодировки.


Ответ

Общий вид такой:
var sourceEncoding = Encoding.GetEncoding(1163); var resultEncoding = Encoding.GetEncoding("windows-1251"); byte[] sourceBytes = utf8.GetBytes(text); byte[] resultBytes = Encoding.Convert(sourceEncoding, resultEncoding, sourceBytes); var result = resultEncoding.GetString(resultBytes);
Только вот Code Page найти я не смог. Вот спецификация на CP1163, вы можете отнаследоваться от System.Text.Encoding и реализовать у него Convert, GetBytes.