【问题标题】:How to send greek characters with HTTP post?如何使用 HTTP post 发送希腊字符?
【发布时间】:2015-02-18 20:25:50
【问题描述】:

我使用以下代码在目标 c 中创建一个请求:

NSString *urlBasic = [NSString stringWithFormat:@"http://localhost:8080/belka/Login?"];
NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys:[defaults objectForKey:@"userID"], @"userID", @"login", @"login", [defaults objectForKey:@"userName"], @"userName", [defaults objectForKey:@"userFirstName"], @"userFirstName", [defaults objectForKey:@"userLastName"], @"userLastName", nil];
NSData *jsonData = [NSJSONSerialization dataWithJSONObject:dict
                                                       options:NSUTF8StringEncoding
                                                         error:&error];
NSString *s=[urlBasic stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
NSURL *url = [NSURL URLWithString:s];
dispatch_async(kBgQueue, ^{
        NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
        [request setHTTPMethod:@"POST"];
        [request setHTTPBody:jsonData];
        NSURLResponse *response;
        NSError *error;
        NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];
        if ((data.length > 0) && (error == nil)) {
            [self performSelectorOnMainThread:@selector(fetchedData:) withObject:data waitUntilDone:NO];
        }
    });

默认情况下,userFirstName 和 userLastName 是希腊语。当我打印“jsonData”描述时,希腊字符是可以的。当我打印 http 正文时,我得到:

<7b227573 65724669 7273744e 616d6522 3a22ce9c ceb1cebd cf8ccebb ceb7cf82 222c226c 6f67696e 223a226c 6f67696e 222c2275 7365724c 6173744e 616d6522 3a224b61 72616d61 6e697322 2c227573 65724944 223a2231 30313532 38313637 33333732 33313638 222c2275 7365724e 616d6522 3a224d61 6e6f6c69 73204b61 72616d61 6e697322 7d>

请求发送后,在java中的服务器端,我有:

 protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    StringBuffer jb = new StringBuffer();
    String line = null;
    try {
        BufferedReader reader = request.getReader();
        while ((line = reader.readLine()) != null)
          jb.append(line);
      } catch (Exception e) { /*report an error*/ }

    try
    {
        InitialContext ctx2 = new InitialContext();
        UserTransaction utx = (UserTransaction) ctx2.lookup("java:module/UserTransaction");
        utx.begin();
        JSONObject data = new JSONObject(jb.toString());
        String facebookID = data.getString("userID");
        String name = data.getString("userFirstName");
        String surname = data.getString("userLastName");
        String username = data.getString("userName");
        System.out.println(name);
        //and other . . . 
        utx.commit();
        response.setCharacterEncoding("UTF-8");
        response.getOutputStream().write(name.getBytes());
    }   
    catch (Exception ex)
    {
        ex.printStackTrace();
    }
}

问题是,当我尝试打印名称时,我得到了这个:ÎανÏÎ»Î·Ï 并且这个名字作为响应被发送回 ios 设备,它是这样的: 响应=“\U00ce\U009c\U00ce\U00b1\U00ce\U00bd\U00cf\U008c\U00ce\U00bb\U00ce\U00b7\U00cf\U0082”; 有什么想法吗?

【问题讨论】:

    标签: java objective-c json http utf-8


    【解决方案1】:

    错误必须在链的最后一位,此处未显示的一段代码打印响应并让您认为传输已损坏。

    iOS 客户端和 Java 服务器可以相互理解,实际上响应是 Μανόλης(我不会说希腊语,但似乎是您要查找的文本)

    您看到的文本ÎανÏÎ»Î·Ï 与解释为某种 7 位编码的字节序列相同(可能是 CP1252,又名拉丁语 1 或 CP1253,希腊代码页,我无法分辨,因为似乎有问题使用 StackOverflow 字体,或者无论如何我的测试程序无法产生该输出)

    Here is the program我曾经分析过您在问题末尾发布的“不正确”回复

    【讨论】:

    • 你提到的响应(Μανόλης)是我想要的。如果这个问题的每个部分的字节都是正确的,我怎么能在我想要的时候打印希腊字符?
    • NSLog(@"%@", request.HTTPBody.description); (对于问题的第一次打印)。在服务器端 System.out.println(name);我得到 ÎανÏληÏ。以及 iOS NSLog(@"%@", response.description); 中的响应我得到响应 = "\U00ce\U009c\U00ce\U00b1\U00ce\U00bd\U00cf\U008c\U00ce\U00bb\U00ce\U00b7\U00cf\U0082";
    • 我希望\UXXXX是Objective-C中unicode字符的转义序列,但还是不明白你为什么看到它。无论如何,字节顺序是正确的,所以错误在服务器代码中,要么是八位字节→字符串转换(可能由容器进行),要么只是字符串→输出传输。在服务器代码的 priting 行放置一个断点,并判断 String 是 Μανόλης 还是 ÎανÏληÏ
    • 在您曾经将 Μανόλης 视为 UTF-8 编码的程序中,您使用的 str 具有 \\ 而我的响应是一个 \。有什么我应该做的吗?很抱歉一直问你,但我正在努力解决这两天。
    • 在服务器代码中放置断点并发布你看到的内容。我的程序是为了回答您的问题而编写的,因此必须将文本转换为字节,并且必须在 Java 字符串中转义反斜杠
    猜你喜欢
    • 2022-07-25
    • 2016-04-02
    • 2013-09-30
    • 1970-01-01
    • 2011-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多