【发布时间】:2015-05-07 21:16:37
【问题描述】:
我正在开发我的 android 项目,我遇到了一个让我抓狂的奇异问题。我正在尝试将字符串转换为 Utf-16 或 Utf-8。 我使用这段代码来实现它,但它给了我一个包含一些负面成员的数组!
Java 代码:
String Tag="سیر";
String Value="";
try{
byte[] bytes = Tag.getBytes("UTF-16");
for(int i=0;i<bytes.length;i++){
Value=Value+String.valueOf(bytes[i])+",";
}
数组成员:
数组成员是[-1,-2,51,6,-52,6,49,6]。我检查了 UTF-16's 表。它没有任何负数,而且我使用了一个将单词转换为 UTF-16M 的网站。它给了我"0633 06CC 0631"HEX。如果将此数字更改为十进制,您将看到:"1577 1740 1585"。如您所见,这里没有负数!所以我的第一个问题是这些负数是什么?!
为什么要将单词转换为 UTF-8 或 UTF-16?
我正在做一个项目。这个项目有两个部分。第一部分是一个向服务器发送关键词的安卓应用程序。这些话是由客户发送的。我的客户使用 (波斯语,فارسی ) 字符。 第二部分是由 C# 制作的 Web 应用程序,它必须响应我的客户。
问题:当我将这些词发送到服务器时,它会处理“????”流而不是正确的词。我尝试了很多方法来解决这个问题,但他们无法解决。之后,我决定自己将字符串的 utf-16 或 utf-8 发送到服务器并将其转换为正确的单词。所以我选择了我在帖子顶部描述的那些方法。
我的原始代码可靠吗?
是的。如果我使用英文字符,它的反应非常好。
我的原始代码是什么?
向服务器发送参数的Java代码:
protected String doInBackground(String...Urls){
String Data="";
HttpURLConnection urlConnection = null;
try{
URL myUrl=new URL("http://10.0.2.2:80/Urgence/SearchResault.aspx?Tag="+Tag);
urlConnection = (HttpURLConnection)myUrl.openConnection();
BufferedReader in = new BufferedReader (new InputStreamReader(urlConnection.getInputStream()));
String temp="";
// Data is used to store Server's Response
while((temp=in.readLine())!=null)
{
Data=Data+temp;
}
}
响应客户端的 C# 代码:
string Tag = Request.QueryString["Tag"].ToString();
SqlConnection con = new SqlConnection(WebConfigurationManager.ConnectionStrings["conStr"].ToString();
SqlCommand cmd = new SqlCommand("FetchResaultByTag");
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.AddWithValue("@NewsTag",Tag);
cmd.Connection = con;
SqlDataReader DR;
String Txt = "";
try
{
con.Open();
DR = cmd.ExecuteReader();
while (DR.Read())
{
Txt = Txt + DR.GetString(0) + "-" + DR.GetString(1) + "-" + DR.GetString(2) + "-" + DR.GetString(3) + "/";
}
//Response.Write(Txt);
con.Close();
}
catch (Exception ex)
{
con.Close();
Response.Write(ex.ToString());
}
*你怎么看?你有什么想法吗?**
【问题讨论】:
-
您正在处理 utf8/16 字符的字节表示。对于您的语言,您将拥有带有高位集的字节,这意味着它们将被视为负数,因为它们被用作有符号整数。
-
你试过在
Tag上使用URLEncoder吗? -
+ value几乎不是构建 URL/查询字符串的有效方法。这是 C# 解决方案stackoverflow.com/questions/829080/…,应该有等效的 Java 解决方案 - stackoverflow.com/questions/5330104/…...但这与您提出问题的方式无关,因此无法回答...