使用TwitterSDK for Android发布推文中的奇怪字符
我已经使用了“getBytes(“UTF-8”);”,但仍然没有显示重音,有什么建议吗?在logcat中没有显示任何错误:( tweet=使用TwitterSDK for Android发布推文中的奇怪字符,android,twitter,character-encoding,share,tweets,Android,Twitter,Character Encoding,Share,Tweets,我已经使用了“getBytes(“UTF-8”);”,但仍然没有显示重音,有什么建议吗?在logcat中没有显示任何错误:( tweet=“重新处理拉莫斯·奇查里托”:塞尔吉奥·拉莫斯、皇家马德里国防军、迪乔·哈维尔·埃尔南德斯和朱加多的重要人物和重新处理……” 返回:reconcose%20Ramos%20al%20%27Chicharito%27%3A%20ergio%20Ramos%2C%20defensa%20del%20Real%20Madrid%2C%20dijo%20que%20J
“重新处理拉莫斯·奇查里托”:塞尔吉奥·拉莫斯、皇家马德里国防军、迪乔·哈维尔·埃尔南德斯和朱加多的重要人物和重新处理……”
返回:reconcose%20Ramos%20al%20%27Chicharito%27%3A%20ergio%20Ramos%2C%20defensa%20del%20Real%20Madrid%2C%20dijo%20que%20Javier%20Hern%E1ndez%20es%20un%20jugador%20important%20y%20reconco…
public String createRequestSignature(String signatureBase, String consumerSecret, String tokenSecret)
throws Exception {
try {
String keyString = URIUtil.encode(consumerSecret) + '&' + URIUtil.encode(tokenSecret);
Debug.i("key " + keyString);
byte[] keyBytes = keyString.getBytes("UTF-8");
SecretKey key = new SecretKeySpec(keyBytes, MAC_NAME);
Mac mac = Mac.getInstance(MAC_NAME);
mac.init(key);
byte[] text = signatureBase.getBytes("UTF-8");
return Base64.encodeBytes(mac.doFinal(text)).trim();
} catch (GeneralSecurityException e) {
throw e;
} catch (UnsupportedEncodingException e) {
throw e;
}
}
签名库:POST&https%3A%2F%2Fapi.twitter.com%2F1.1%2fstatus%2update.json&oauth_消费者密钥%3DqW5IFxldNY0wSPEw8vTw9Q%26oauth_nonce%3da7254620cc1a2cb59464a315f27 ec464b7909a56%26oauth_签名方法%3DHMAC-SHA1%26oauth_时间戳%3D1409680538%26oauth_令牌%2649274;-0kv9;%3d927564-0kvxusukuwkvwkvwkv719u版本%2u6状态%3重新处理%2520Ramos%2520al%2520%2527Chicharito%2527%253A%2520Sergio%2520Ramos%252C%2520defensa%2520del%2520Real%2520Adrid%252C%2520dijo%2520que%2520Javier%2520Hern%25E1ndez%2520es%2520un%2520jugador%2520Important%2520y%2520Recoo…
public String createRequestSignature(String signatureBase, String consumerSecret, String tokenSecret)
throws Exception {
try {
String keyString = URIUtil.encode(consumerSecret) + '&' + URIUtil.encode(tokenSecret);
Debug.i("key " + keyString);
byte[] keyBytes = keyString.getBytes("UTF-8");
SecretKey key = new SecretKeySpec(keyBytes, MAC_NAME);
Mac mac = Mac.getInstance(MAC_NAME);
mac.init(key);
byte[] text = signatureBase.getBytes("UTF-8");
return Base64.encodeBytes(mac.doFinal(text)).trim();
} catch (GeneralSecurityException e) {
throw e;
} catch (UnsupportedEncodingException e) {
throw e;
}
}
在时间轴上看:拉莫斯的“奇查里托”:塞尔吉奥·拉莫斯、皇家马德里的德菲萨、哈维尔·赫恩的《复兴》?《复兴》是一部重要的复兴之作
public String getQueryString() {
if (mParams.size() == 0) {
return "";
}
StringBuffer querySb = new StringBuffer();
int size = mParams.size();
int i = 0;
for (String key : mParams.keySet()) {
HttpValues values = mParams.get(key);
if (values != null) {
if (!values.isEmpty()) {
TreeSet<String> vals = values.getAll();
Iterator<String> iterator = vals.iterator();
while (iterator.hasNext()) {
querySb.append(key + "=" + URIUtil.encode((String) iterator.next()));
if (iterator.hasNext()) {
querySb.append("&");
}
}
} else {
querySb.append(key + "=");
}
} else {
querySb.append(key + "=");
}
if (i != size-1) {
querySb.append("&");
}
i++;
}
return querySb.toString();
}
public static String encode(String input) {
StringBuilder resultStr = new StringBuilder();
for (char ch : input.toCharArray()) {
if (isUnSafe(ch)) {
resultStr.append('%');
resultStr.append(toHex(ch / 16));
resultStr.append(toHex(ch % 16));
} else {
resultStr.append(ch);
}
}
return resultStr.toString();
}
private static char toHex(int ch) {
return (char) (ch < 10 ? '0' + ch : 'A' + ch - 10);
}
private static boolean isUnSafe(char ch) {
if (ch > 128 || ch < 0)
return true;
return " %*$&+,/:;=?@<>#%'\n".indexOf(ch) >= 0;
}
公共字符串getQueryString(){
如果(mParams.size()==0){
返回“”;
}
StringBuffer querySb=新的StringBuffer();
int size=mParams.size();
int i=0;
for(字符串键:mParams.keySet()){
HttpValues=mParams.get(键);
如果(值!=null){
如果(!values.isEmpty()){
TreeSet vals=values.getAll();
迭代器迭代器=vals.Iterator();
while(iterator.hasNext()){
append(key+“=”+URIUtil.encode((String)iterator.next());
if(iterator.hasNext()){
查询b.追加(“&”);
}
}
}否则{
querySb.append(键+“=”);
}
}否则{
querySb.append(键+“=”);
}
如果(i!=尺寸-1){
查询b.追加(“&”);
}
i++;
}
返回querySb.toString();
}
公共静态字符串编码(字符串输入){
StringBuilder resultStr=新建StringBuilder();
for(char ch:input.toCharArray()){
如果(不安全(ch)){
结果tr.append('%');
结果tr.append(toHex(ch/16));
结果tr.append(toHex(ch%16));
}否则{
结果追加(ch);
}
}
返回resultStr.toString();
}
私有静态字符到十六进制(int-ch){
返回(字符)(ch<10?'0'+ch:A'+ch-10);
}
私有静态布尔值不安全(char ch){
如果(ch>128 | | ch<0)
返回true;
返回“%*$&+,/:;=?@#%'\n”.indexOf(ch)>=0;
}
您已经显示了创建请求签名的代码…您还没有显示如何对推文本身进行编码。抱歉…@JonSkeet现在它已被编辑。看起来您正在进行自己的URL编码,但对非ASCII字符使用UTF-16。这就是问题所在。我强烈建议您使用第三方库(或者Android库中的某些东西)来进行URL编码。