I / O ascii коды для иностранных символов - PullRequest
0 голосов
/ 06 апреля 2019

Используя cout << "\n\u00f3\n << endl, я могу печатать - с символами новой строки в командной строке Unix.Как только я начинаю пытаться читать файлы и печатать строки, содержащие символы, вместо этого я вижу буквальный вывод \ n \ u00f3 \ n.

Я не уверен, так ли это, потому что методы чтения файлов используют символьные массивы или еслиесть какой-то другой нюанс, которого я не знаю.

Есть идеи?

Спасибо!

const char *filename ="spanish_project_sample1.txt";
FILE *file = fopen(filename, "r");
    int c;
    char *data;
    data = " ";
    while ((c=fgetc(file)) != EOF) {
        data = appendCharToCharArray(data, c);
    }
    printf("%s", data);

Ответы [ 2 ]

0 голосов
/ 06 апреля 2019

Идиома C ++ для чтения файла строка за строкой:

#include <fstream>
#include <iostream>

using namespace std;

int main(int argc, char **argv)
{
    string line;
    ifstream ifs;
    ifs.open(argv[1]);

    while(getline(ifs, line))
        cout << line << endl;
}

Попробуй это.

Ваша проблема, вероятно, одна из интерпретаций. Если у вас есть «\ n \ u00f3 \ n» в файле, это то, что он читает и печатает. Если у вас есть «" »в файле, который хранится как \ u00f3 в UTF-16, вы получите то, что хотите. Процедуры ввода / вывода не выполняют никаких преобразований.

Вам также необходимо знать, находится ли ваш файл в UTF-8 или UTF-16, чтобы вы могли правильно его прочитать.

0 голосов
/ 06 апреля 2019

Я посмотрел на решения JavaScript для аналогичной проблемы (например, FromCharCode) и нашел этот код в Интернете: https://ideone.com/Udo3hN

#include <cstdarg>
#include <iostream>

using namespace std;

string FromCharCode ( int num, ... )
{
  va_list arguments;  
  char ch; 
  string s;                 
  va_start ( arguments, num );           
  for ( int x = 0; x < num; x++ )        
   {
         ch = va_arg ( arguments, int ); 
         s = s + ch;
   }
  va_end ( arguments );   
  return s;

}
int main()
{
 cout<<FromCharCode (10,73,78,68,69,83,73,71,78,33,33) ;//<<endl;
 return 0;
}

В частности, похоже, что чтение символов является проблемой, потому что во время выполнениявместо того, чтобы читать '\ n' как значение 10, например, массив символов будет фактически записывать два целых [92,110].

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

Любые предложения или решения по-прежнему приветствуются.

...