Странный ASCII-ответ (китайский) при попытке реплицировать strlwr в кодовых блоках 13.12

Следующий код дает очень странный результат:

#include <iostream>
#include <fstream>

using namespace std;

ifstream f("f1.in");
ofstream g("f1.out");
char sir[255];
int i;

char strlwr(char sir[]) //if void nothing changes
{
int i = 0;

for (i = 0; sir[i] != NULL; i++) {
sir[i] = tolower(sir[i]);
}

return 0;  //if instead of 0 is 1 it will kinda work , but strlwr(sir) still needs to   be displayed
}

int main()
{
f.get(sir, 255);
g << sir << '\n'; // without '\n' strlwr will no more maters
g << strlwr(sir);
g << sir;
return 0;
}

f1.in:

JHON HAS A COW

f1.out:

䡊乏䠠十䄠䌠坏
桪湯栠獡愠挠睯

Это показывает это только тогда, когда я использую только CAPS.
Я использую Code :: Blocks 13.12 на Ubuntu 14, европейская версия.
Мне было бы очень интересно узнать, почему это показывает это.
Мне интересно знать, дает ли это вам то же самое.

1

Решение

Поздравляем! Вы обнаружили кракозябры! Ваш выходной текст на 100% правильный, но что бы вы ни просматривали, он интерпретирует его как юникод.

Если вы преобразуете вывод Unicode в их шестнадцатеричные числовые значения, проблема станет ясной. (Код заимствован из этот ответ StackOverflow.)

$ cat unicode.txt
䡊乏䠠十䄠䌠坏
桪湯栠獡愠挠睯

$ cat unicode.txt | while IFS= read -r -d '' -n1 c; do printf "%02X\n" "'$c"; done
484A
4E4F
4820
5341
4120
4320
574F
0A
686A
6E6F
6820
7361
6120
6320
776F
0A

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

Если вместо этого вы интерпретируете шестнадцатеричный вывод как однобайтовый ASCII (и исправляете порядок байтов), вы можете видеть, что ваша программа работала:

$ cat unicode.txt | while IFS= read -r -d '' -n1 c; do printf "%02X\n" "'$c"; done
484A ; JH
4E4F ; ON
4820 ;  H
5341 ; AS
4120 ;  A
4320 ;  C
574F ; OW
0A   ; \n
686A ; jh
6E6F ; on
6820 ;  h
7361 ; as
6120 ;  a
6320 ;  c
776F ; ow
0A   ; \n

Чтобы определить, является ли проблема вашей программой на C ++ или программой просмотра, попробуйте выполнить следующую команду xxd f1.out, Если это похоже на ASCII, то это ошибка ваших программ просмотра. В противном случае, это ошибка вашей программы, и вы должны посмотреть на Setlocale и / или открытие вашего выходного файла в двоичном режиме.

В любом случае, вы, вероятно, должны изменить g<<strlwr(sir); чтобы просто strlwr(sir);, В настоящее время он добавляет байт NULL к вашему выводу, что, вероятно, непреднамеренно.

1

Другие решения