2016-05-31 2 views
2

우리는 C#과 PHP 사이의 안정적인 통신 및 데이터 전송에 의존하는 응용 프로그램을 개발 중입니다.C# - PHP 문자 인코딩 불일치


플랜 : 우리는 PHP 서버에 API를 요청하여 반환받을 값을 편집 할 수있는 C 번호의 데스크톱 응용 프로그램을 만들기

.


문제점

예를 들어 특수 문자를 포함하는 값 전송 : 우리는 PHP에 도달하면 값을 API에 대한 변경있어 사실을 발견 C# RestClient 클래스를 사용하여 PHP에 é을 예 : é ~ é.

이것에 대한 정보를 검색 할 때 우리는 문자 인코딩과 관련이 있다는 것을 알았습니다. PHP API는 utf-8을 사용하고 C#은 우리가 알고있는 한 utf-8을 사용합니다.


규범


전송하고, 요청이 생성하는 C# 1 부 :

string tmp = JsonConvert.SerializeObject(deelname); 
client = new RestClient((local) ? "http://rotserver" : "https://registrations.roundtexel.com/"); 
var request = new RestRequest((local) ? "?action=deelname" : "api/bewerk", Method.POST); 
request.AddParameter("username", (local) ? Convert.ToBase64String(Encoding.UTF8.GetBytes(User)) : User); 
request.AddParameter("type", (local) ? Convert.ToBase64String(Encoding.UTF8.GetBytes("deelname")) : "deelname"); 
request.AddParameter("inschrijf_id", (local) ? Convert.ToBase64String(Encoding.UTF8.GetBytes(inschrijf_id)) : inschrijf_id); 
request.AddParameter("stuurman_id", (local) ? Convert.ToBase64String(Encoding.UTF8.GetBytes(stuurman_id)) : stuurman_id); 
request.AddParameter("bemanning_id", (local) ? Convert.ToBase64String(Encoding.UTF8.GetBytes(bemanning_id)) : bemanning_id); 
request.AddParameter("voertuig_id", (local) ? Convert.ToBase64String(Encoding.UTF8.GetBytes(voertuig_id)) : voertuig_id); 
request.AddParameter("boot_id", (local) ? Convert.ToBase64String(Encoding.UTF8.GetBytes(boot_id)) : boot_id); 
request.AddParameter("content", (local) ? Convert.ToBase64String(Encoding.UTF8.GetBytes(tmp)) : tmp); 
IRestResponse response = client.Execute(request); 

코드의 PHP/API 부 :

public function __construct() { 
    $this->db = new PDO('mysql:host=localhost;dbname=xxxxxx', 'xxxxxx', 'xxxxxx'); 
    $this->db->exec("SET names utf8;"); 
} 

public function execute(){ 
    $content = json_decode($_POST['content']); 
    #Stuurman 
    $stuurman_id = $_POST['stuurman_id']; 
    $stuurman = $content->deelnemerStuurman; 
    $stmnt = $this->db->prepare("UPDATE `~deelnemer` SET voornaam=?, tussenvoegsel=?, achternaam=?, adres=?, huisnummer=?, toevoeging=?, postcode=?, woonplaats=?, provincie=?, geslacht=?, geboortedatum=?, nationaliteit=(SELECT id FROM `~nationaliteiten` WHERE nationaliteit=?), licentie=1, licentie_nummer=?, telefoonnummer=?, mobielenummer=?, noodnummer=?, email=?, afbeeldingsnaam=?, whatsapp_registratie=? WHERE id=?"); 
    $stmnt->execute(Array($stuurman->voornaam, $stuurman->tussenvoegsel, $stuurman->achternaam, $stuurman->adres, $stuurman->huisnummer, $stuurman->toevoeging,$stuurman->postcode,$stuurman->woonplaats, $stuurman->provincie, $stuurman->geslacht, $stuurman->geboortedatum,$stuurman->land, $stuurman->licentie_nummer, $stuurman->telefoonnummer, $stuurman->mobielenummer, $stuurman->noodnummer, $stuurman->email, $stuurman->afbeeldingsnaam, $stuurman->whatsapp_registratie, $stuurman_id)); 
    var_dump($stuurman->voornaam); 
    $tmp = "{status: 'success'}"; 
    return $tmp; 
} 

var_dump의 우리는 그 이름을 발견했기 때문에 : André 나는 사람이 우리를 도울 수 있기를 바랍니다

, 친절 감사 제프리

답변

0

당신을 : André가 변경되었습니다 html로 문자열을 이스케이프 처리하여 é가 & # 233으로 변경 될 수 있습니다. 또는 ´ 당신이 보내기 전에.

PHP에서 C# 및의 html_entity_decode에

사용 HttpUtility.HtmlEncode

+0

당신은 PHP에서 URLDECODE ($ 문자열)를 사용한다 코딩하는 URL로 문자열을 인코딩하기 때문에 –