2014-10-31 2 views
0

에 나는 자바에서 PHP로 일부 데이터를 게시 :POST 비 라틴어 데이터를 자바에서 PHP

try { 
     URL obj = new URL("http://myphpurl/insert.php"); 
     HttpURLConnection conn = (HttpURLConnection) obj.openConnection(); 
     conn.setReadTimeout(10000); 
     conn.setConnectTimeout(15000); 
     conn.setRequestMethod(POST_METHOD); 
     conn.setDoInput(true); 
     conn.setDoOutput(true); 

     Map<String, String> params = new HashMap<String, String>(); 
     params.put("title", "العربية"); 

     OutputStream os = conn.getOutputStream(); 
     BufferedWriter writer = 
      new BufferedWriter(new OutputStreamWriter(os, "UTF-8")); 
     writer.write(getQuery(params)); 
     writer.flush(); 
     writer.close(); 
     os.close(); 

     BufferedReader in = 
      new BufferedReader(new InputStreamReader(conn.getInputStream(), "UTF-8")); 
     String inputLine; 
     while ((inputLine = in.readLine()) != null) { 
      response.append(inputLine); 
     } 
     LOG.debug("response {}", response); 

     in.close(); 
     response = null; 
     inputLine = null; 
     conn.disconnect(); 
     conn = null; 
     obj = null; 
    } catch (MalformedURLException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 


    private String getQuery(Map<String, String> params) throws UnsupportedEncodingException { 
     StringBuilder result = new StringBuilder(); 
     boolean first = true; 

     Iterator<Map.Entry<String, String>> it = params.entrySet().iterator(); 
     while (it.hasNext()) { 
      if (first) 
       first = false; 
      else 
       result.append("&"); 

      Map.Entry<String, String> pairs = it.next(); 

      result.append(URLEncoder.encode(pairs.getKey(), "UTF-8")); 
      result.append("="); 
      result.append(URLEncoder.encode(pairs.getValue(), "UTF-8")); 

      it.remove(); // avoids a ConcurrentModificationException 
     } 

    return result.toString(); 
} 

insert.php 파일은 다음과 같다 :

<?php 
    $posttitle = $_POST["title"]; 
    echo "$posttitle"; 
    echo urldecode($posttitle); 
?> 

에코 대신 일부 gibbrish مليون을 보여 실제 제목 العربية입니다.

이 gibbrish는 mysql 데이터베이스에 삽입됩니다.

Additionnal 정보 :

  • 데이터베이스가 utf8_general_ci이며 (I 수동으로 작동하면 phpMyAdmin을 사용하여 게시물을 업데이트 할 때) 아랍어 지원합니다.

  • 나는 InputStreamReaderInputStreamWriterUTF-8을 추가, 나는 다음과 같은 문제가 있었다 : 창에

    • Tomcat6, (PHP + MySQL을)에 CentOS에를 - (CentOS는에서 확인>
    • Tomcat6을 에 CentOS에 PHP + MySQL의) -> 안 OK

Additionnal 정보를 정기적으로 2

  • 자바 스크립트를 사용하여 게시하면 페이지가 올바르게 인코딩됩니다.

답변

1

코드에 문제가 발생할 수 있으며 테스트 할 수 없습니다. 또한 URLConnection 대신 완전한 기능의 HTTP 클라이언트를 사용하는 것이 좋습니다. 당신이 확인해야하는지의 목록 :

  • 이 테스트는 하드 코드 (javac에 대한 권리 소스 파일 인코딩을 통과 동일한 바이너리를 실행하거나 배포 컴퓨터에서 컴파일 어쨌든 IDE에서 프로그램을 실행하거나합니까. ?)
  • 를 사용하여 UTF-8 당신의 API는 HTTP 요청 본문을 사용하는 경우
  • PHP가 가지고있는 콘텐츠 형식의 MIME 헤더를 모두 끝이 인코딩에 동의 확인 및/또는 사용, 쿼리 문자열
  • 를 인코딩 바이너리 문자열 (인코딩이 주어져야 함)이므로 데이터베이스에 연결할 때 적절한 매개 변수를 사용하고/또는 ly
  • PHP 서버에서 텍스트를 보낼 때 템플릿과 동적 비트의 인코딩을 기억하십시오!

움직이는 부분의 수가 아주 큽니다. 다른 레벨의 트랜스 코딩을 추가하기 때문에 print/echo를 통해 디버깅해서는 안됩니다. 가능한 경우 원시 텍스트 바이트를 덤프하고 16 진수 편집기를 사용하십시오.

Windows → Linux는 괜찮지 만 Linux는 Linux가 아닌 것은 재미 있습니다. 두 CentOS 컴퓨터에서 로케일을 검사 할 수 있습니다 (대상 프로세스 내부에서 운영 체제 명령 (JVM 및 Apache) 실행 가능)

+0

eclipse + tomcat (Windows의 경우)에서 실행하고 maven이 CentOS의 패키지 전쟁 . –

+0

요청 본문에 contentType MIME 유형을 추가했지만 매개 변수가 더 이상 전달되지 않습니다. (모두 비어 있음) : conn.setRequestProperty ("Content-Type", "text/plain; charset = utf-8"); ' –

+0

자바 스크립트는 동일한 PHP 파일을 테스트 http://audiogag.net/preprod_files/submittest.html. 잘 작동하기 때문에 PHP 문제가 될 수 없습니다. –

0

가능한 인코딩 예외를 표시하려면 CharsetEncoder을 사용해보십시오.

CharsetEncoder encoder = Charset.forName("UTF-8").newEncoder(); 
encoder.onMalformedInput(CodingErrorAction.REPORT); 
encoder.onUnmappableCharacter(CodingErrorAction.REPORT); 
관련 문제