2013-08-23 3 views
0

Я инициализирую строку, используя следующий код.Как читать текстовый файл с кодами Unicode?

std::string unicode8String = "\u00C1 M\u00F3ti S\u00F3l"; 

Печать его с помощью cout, выход Á Моти Sól.

Но когда я прочитал ту же ту же строку из текстового файла с помощью ifstream, храните его в std::string, и распечатать его, выход \ u00C1 M \ u00F3ti S \ u00F3l.

Содержание моего файла \ u00C1 M \ u00F3ti S \ u00F3l и я хочу, чтобы напечатать его как Á Моти SOL. Есть какой-либо способ сделать это?

+0

Я уверен, что это спрашивали прежде. Вы искали? – trojanfoe

+0

В вашем вопросе нет кодов UTF. Если вы хотите преобразовать шестую строку символов \ u00C1 в символ со значением 0xC1, тогда вам нужно написать код для синтаксического анализа строки. Нет быстрого ответа. Но поскольку вы смущены тем, что делаете, я думаю, вы, вероятно, действительно хотите сделать что-то еще. Очень сложно сказать, что. – john

+0

Да, я искал, но не смог найти решение. – Anubha

ответ

0

Off верхней части моей головы (полностью непроверенной)

std::string convert_string(const std::string& in) 
{ 
    std::string out; 
    for (size_t i = 0; i < in.size();) 
    { 
     if (i + 5 < in.size() && in[i] == '\\' && in[i+1] == 'u' && 
      in[i+2] == '0' && in[i+3] == '0' && 
      isxdigit(in[i+4]) && isxdigit(in[i+5])) 
     { 
      out += (unsigned char)16*in[i+4] + (unsigned char)in[i+5]; 
      i += 6; 
     } 
     else 
     { 
      out += in[i]; 
      ++i; 
     } 
    } 
    return out; 
} 

Но это не будет работать с любыми значениями Юникода выше 255, (например, \ u1234), потому что у вас есть фундаментальная проблема, что ваша строка хранит 8 бит, а символы Unicode могут иметь до 20 бит.

Как я сказал, совершенно непроверенный, но я уверен, что вы поняли эту идею.

+0

Значит, мне нужно написать функцию самостоятельно? Насколько я понимаю, \ u00C1 является Á, а \ u00F3 - и так далее ... Итак, это символы Unicode, поэтому не существует ли уже существующих ранее функций/библиотек? – Anubha

+0

Вам нужно будет решить, находятся ли эти символы unicode в строке или нет. Джон так считает, и вы, кажется, не уверены. – trojanfoe

+0

txt-файл содержит \ u00C1 M \ u00F3ti S \ u00F3l, поэтому, когда я читаю его в строку, строка имеет «\ u00C1 M \ u00F3ti S \ u00F3l» – Anubha

0

Можете ли вы попробовать распечатать, используя «std::wcout»!

0

Юникод-символы имеют различное представление в текстовом файле (нет \ u).

Для оценки

int main() 
{ 
    // Write 
    { 
     std::string s = "\u00C1 M\u00F3ti S\u00F3l"; 
     std::ofstream out("/tmp/test.txt"); 
     out << s; 
    } 
    // Read Text 
    { 
     std::string s; 
     std::ifstream in("/tmp/test.txt"); 
     std::getline(in, s); 
     std::cout << "Result: " << s << std::endl; 
    } 
    // Read Binary 
    { 
     std::ifstream in("/tmp/test.txt"); 
     in.unsetf(std::ios_base::skipws); 
     std::istream_iterator<unsigned char> first(in); 
     std::istream_iterator<unsigned char> last; 
     std::vector<unsigned char> v(first, last); 
     std::cout << "Result: "; 
     for(unsigned c: v) std::cout << std::hex << c << ' '; 
     std::cout << std::endl; 
    } 
    return 0; 
} 

В Linux с UTF8: Результат: Моти Sól Результат: c3 81 20 4d c3 b3 74 69 20 53 c3 b3 6с

+0

Я имел в виду, что файл не был в формате UTF8, файл буквально имел строку «\ u00C1 M \ u00F3ti S \ u00F3l», а не Á Móti Sól. С вашей записью файл содержит Á Móti Sól для начала. – Anubha

Смежные вопросы