Python:打开带有重音符号的网址

时间:2018-08-06 20:36:37

标签: python utf-8 urllib2

在Python 2.7中,我想打开一个包含重音符号的URL(链接本身,而不是其指向的页面)。如果我使用以下内容:

#!/usr/bin/env Python
# -*- coding: utf-8 -*-

import urllib2


test = "https://www.notifymydevice.com/push?ApiKey=K6HGFJJCCQE04G29OHSRBIXI&PushTitle=Les%20accents%20:%20éèçà&PushText=Messages%20éèçà&"

urllib2.urlopen(test)

我的口音转换为胡言乱语(Ã,¨,©等,而不是我期望的éèà)。

我已经搜索过此类问题,因此尝试使用 urllib2.urlopen(test.encode('utf-8')),但Python在这种情况下会引发错误:

  

文件“ test.py”,第10行,在          urllib2.urlopen(test.encode('utf8'))UnicodeDecodeError:'ascii'编解码器无法解码位置98的字节0xc3:序数不在范围(128)中

2 个答案:

答案 0 :(得分:1)

使用return (1, "a", "b", "c")前缀字符串。我在使用repl进行尝试时没有错误

 recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
        int width = getApplicationContext().getResources().getDisplayMetrics().widthPixels;
        int daysToBeAdded;
        int totalDX;

        @Override
        public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
            super.onScrolled(recyclerView, dx, dy);

            totalDX+= dx;
        }

        @Override
        public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
            super.onScrollStateChanged(recyclerView, newState);

            if (newState == RecyclerView.SCROLL_STATE_IDLE) {
                daysToBeAdded = totalDX / width;
                cal.add(Calendar.DATE, daysToBeAdded);
                setCurrentDate(cal.getTime());
                totalDX = 0;
            }

        }
    });

u前缀是unicode strings

答案 1 :(得分:1)

如果您在encode上调用str,Python必须先将其解码为unicode,以便它将Unicode编码为UTF-8。为了解码它,它必须猜测您使用了哪种编码,因为您没有告诉它。因此,它会猜测'ascii'(实际上,它会猜测sys.getdefaultencoding()所说的内容,但通常是'ascii'),

无论如何,这里有两个可能的问题,有不同的解决方案。因此,在尝试修复该问题之前,您需要先弄清楚哪一个问题。


尝试打印出字符串的各个字节,或更简单地打印repr

print repr(test)
  • 如果é显示为\xc3\xa9,则为UTF-8。
  • 如果它显示为\xe9,则为Latin-1(或cp1252或与Latin-1兼容的其他名称)。
  • 如果它显示为其他字符,则它是一个不同的字符集,您必须找出哪个字符集。

如果您要提供Python Latin-1源码并告诉它是UTF-8,它不会发牢骚,但这意味着您将在您认为要发送UTF-8字符的地方发送Latin-1字节。 ,您到处都会得到mojibake。

解决方法是在文本编辑器中将源代码另存为UTF-8。


如果它已经是 UTF-8,则问题在于服务器不希望该URL为UTF-8。

URL标准对(%编码的)非ASCII字节没有强制要求任何特殊含义;任何服务器都可以对它们执行任何操作。而且,如果您正在与将此类字节视为cp1252的服务器进行通信,但要发送的是UTF-8,则将获得mojibake。

此问题的解决方法是,如果您控制服务器,则将服务器重新配置为处理UTF-8;如果不这样做,则以服务器所需的字符集发送字符串。