3

これと同じように見える質問をかなり見つけましたが、最善の努力にもかかわらず、解決策を機能させることができません。

古いテキストベースのメニューを作成するために、拡張 ASCII 文字を印刷しようとしています。これが私の元のコードです:

print('╔════════════════════════════════════╗')
print('║           Hello World!             ║')
print('╚════════════════════════════════════╝')

.py ファイルを実行すると、出力は次のようになります。

??????????????????????????????????????
?           Hello World!             ?
??????????????????????????????????????

私は Python 3.3.1 を使用しており、Windows と Linux の両方で「正常に動作する」ソリューションが必要です。chcp 65001Windows コンソールで試してみましたが、うまくいきませんでした。

「setdefaultencoding」を使用してみましたが、Python 3 には適用されなくなったと思います。

4

3 に答える 3

4

もっと良い方法があるはずですが、次のような方法はどうでしょうか。

dic = {
'\\' : b'\xe2\x95\x9a',
'-'  : b'\xe2\x95\x90',
'/'  : b'\xe2\x95\x9d',
'|'  : b'\xe2\x95\x91',
'+'  : b'\xe2\x95\x94',
'%'  : b'\xe2\x95\x97',
}

def decode(x):
    return (''.join(dic.get(i, i.encode('utf-8')).decode('utf-8') for i in x))

print(decode('+------------------------------------%'))
print(decode('|           Hello World!             |'))
print(decode('\\------------------------------------/'))

ウィンドウズ:

C:\Temp>python temp.py
╔════════════════════════════════════╗
║           Hello World!             ║
╚════════════════════════════════════╝

Linux:

$ python3 temp.py 
╔════════════════════════════════════╗
║           Hello World!             ║
╚════════════════════════════════════╝
于 2013-06-22T20:35:21.367 に答える
3

Python 3 とその Unicode 文字列を使用すると、次の規則に従う限り、元のコードは問題なく動作するはずです。

  • 文字をサポートするエンコードでファイルを保存します。
  • #coding: <encoding>UTF-8 のデフォルトでない場合は、ソース エンコーディングを宣言します。
  • デフォルトのコンソール エンコーディングは、これらの文字をサポートしています。
  • コンソール フォントは文字グリフをサポートします。

以下に追加したcodingステートメントは、Python 3 のデフォルトであるためオプションですutf8。ファイルが実際に正しいエンコーディングで保存されていることを確認してください。

# coding: utf8
print('╔════════════════════════════════════╗')
print('║           Hello World!             ║')
print('╚════════════════════════════════════╝')

Windows コンソールの出力 (コード ページ 437、Consolas フォント):

╔════════════════════════════════════╗
║           Hello World!             ║
╚════════════════════════════════════╝

PythonWin IDE での出力 (UTF-8 エンコーディング、および通常の Linux の既定値と Courier New フォント):

╔════════════════════════════════════╗
║           Hello World!             ║
╚════════════════════════════════════╝

注意chcp 65001(UTF-8) は Windows や Python 3 ではバグがあります:

╔════════════════════════════════════╗
��═══════════════════════╗
�══════════════╗
�════════╗
�════╗
��═╗
��
║           Hello World!             ║
��
╚════════════════════════════════════╝
��═══════════════════════╝
�══════════════╝
�════════╝
�════╝
��═╝
��

また、Python 2 でも注意setdefaultdecodingが必要になることはありませんでした。Unicode 文字列はデフォルトではありませんでした。このコードは、Python 2.XおよびPython 3.3 以降で動作します。Python 3.3 では、 u''Python 2.X コードの移植を支援するためにオプションの構文が追加されているためです。

# coding: utf8
print(u'╔════════════════════════════════════╗')
print(u'║           Hello World!             ║')
print(u'╚════════════════════════════════════╝')
于 2013-06-22T21:14:04.163 に答える
1

ここに私が観察できるものがあります。私の場合 (Windows 7、チェコ語) では、デフォルトのエンコーディングが 852 であることに注意してください。コードは UTF-8 で保存され、Python 3.3.0 が使用されました。

ここに画像の説明を入力

バグのようですが、Python なのか、Windows コンソールなのか、椅子とキーボードの間なのかわかりません。

于 2013-06-22T21:15:27.843 に答える