Функция Python chr () возвращает неправильные символы - PullRequest
0 голосов
/ 14 сентября 2018

Я пытаюсь написать простую программу: В цикле while он принимает целое число (гарантированно в диапазоне 0, 255), превращает его в соответствующий символ и записывает этот символ в файл до тех пор, пока целое число ввода не станет -1. Я написал это на C ++, и это хорошо работает. Код:

#include <iostream>
#include <fstream>
using namespace std;

int main(){
    char c;
    int p;

    ofstream myfile;
    myfile.open ("a.txt");

    while(true){
        cin>>p;
        if(p == -1)
            break;
        c = p;

        myfile << c;
    }

    return 0;
}

Я также пытался написать ту же программу на Python 3, код:

import sys

file = open("b.txt", "w")
while True:
    p = int(input())
    if p == -1:
        break
    c = chr(p)
    file.write(c)

Проблема в том, что на некоторых входах они дают разные выходы, например на входе:

0
3
38
58
41
0
194
209
54
240
59
-1

C ++ дает вывод:

0003 263a 2900 c2d1 36f0 3b

и python выдает:

0003 263a 2900 c382 c391 36c3 b03b 

У меня есть контрольные примеры, поэтому я знаю, что вывод C ++ правильный. В чем может быть проблема?

1 Ответ

0 голосов
/ 14 сентября 2018

Ваше понятие "персонаж" выглядит как "байт".Питона нет;Концепция «символа» в Python 3 - это «кодовая точка Unicode», и то, как они преобразуются в байты, зависит от кодировки.

Если вы хотите записать байты, вы должны открыть свой файл в двоичном режиме (в обоихC ++ и Python), и вы должны изменить свой код Python для передачи bytes объектов на write:

with open("b.txt", "wb") as file:
    while True:
        p = int(input())
        if p == -1:
            break
        # file.write(bytearray([p])) for Python 2 compatibility
        file.write(bytes([p]))
...