如何在Python 2.x中获取系统默认编码?

时间:2016-05-29 05:29:54

标签: python-2.7 character-encoding

我尝试了sys.getdefaultencoding(),但不幸的是,这不起作用。它在我的系统上返回ascii,系统区域设置为ja_JP(即编码应为Shift-JIS)。

我正在尝试解析CJK文本(在Windows上)。我需要从键盘读取一些文本,确定系统编码,并将其转换为utf8。我经常在zh_CN(GBK编码)和ja_JP(Shift-JIS编码)之间更改我的系统区域设置,因此硬编码系统编码(键盘输入文本的编码)不是一个选项。任何解决方案?

2 个答案:

答案 0 :(得分:4)

解决:sys.stdin.encoding

此外,对于任何尝试sys.getdefaultencoding()的人来说,根据https://wiki.python.org/moin/DefaultEncoding,它几​​乎永远不会有效,并始终为ascii

  

它的价值应该是' ascii'它在将字节字符串转换为unicode字符串时使用。

  

如果将非ascii字符放入字节字符串,则.decode(sys.getdefaultencoding())方法将因UnicodeDecodeError而失败,因此字节字符串不应包含非ascii字符。

答案 1 :(得分:1)

由于声誉而无法评论以上答案,但是:

在非tty模式下运行时,请注意// The parent container mNotificationOverlay = (LinearLayout) findViewById(R.id.container_destacado); LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE); for (Message message : m) { // Inflate the child layout on the fly final View notificationContainer = inflater.inflate(R.layout.notification_overlay_linear_layout, null); notificationContainer.setTag(message.getNotificationId()); // Access children of child container TextView notificationOverlayTitle = (TextView) notificationContainer.findViewById(R.id.notification_title_overlay); TextView notificationOverlayBody = (TextView) notificationContainer.findViewById(R.id.notification_body_overlay); ImageButton notificationOverlayCancelButton = (ImageButton) notificationContainer.findViewById(R.id.notification_cancel_overlay); // Perform desired operations notificationOverlayCancelButton.setTag(message.getNotificationId()); notificationOverlayTitle.setText(message.getTitle()); notificationOverlayBody.setText(message.getNotificationBody()); mNotificationOverlay.setVisibility(View.VISIBLE); // Attach any listeners attachListenersToCancelView(notificationOverlayCancelButton); // Add view to parent container mNotificationOverlay.addView(notificationContainer); }

sys.[stdin|stdout].encoding

如您所见,使用$ tty /dev/pts/2 $ python2 -c'import locale, sys; print(sys.stdout, type(sys.stdout), sys.stdin.encoding, locale.getpreferredencoding())' (<open file '<stdout>', mode 'w' at 0x7fa77abff150>, <type 'file'>, 'UTF-8', 'UTF-8') $ ssh $HOSTNAME tty not a tty $ ssh $HOSTNAME "python2 -c'import locale, sys; print(sys.stdout, type(sys.stdout), sys.stdin.encoding, locale.getpreferredencoding())'" (<open file '<stdout>', mode 'w' at 0x7f7991c43150>, <type 'file'>, None, 'UTF-8') 可能更安全。

(Py3上没有问题,所以这只是出于2020年的历史记录;-))。