在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)中
答案 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;如果不这样做,则以服务器所需的字符集发送字符串。