libcurl and httpHeaders
BlitzMax Forums/Brucey's Modules/libcurl and httpHeaders
| ||
| I am trying to check whether a name exists in my player database using libcurl to connect to a php page. This works fine until I throw some foreign characters into the mix. Both the names Simon Read and José Hernández are in the database but José is not found. I believe the problem lies in setting the charset to utf-8 but I'm struggling to work out how to do this. If I uncomment the httpHeader line it causing problems posting the form. What am I doing wrong?
Import bah.libcurl
CheckPlayerExists("Simon Read")
CheckPlayerExists("José Hernández")
Function CheckPlayerExists:Int(name:String)
Local url:String = "http://newstarsoccer.newstargames.com/gamephp/checkexists.php"
Local form:TCurlFormData = TCurlFormData.Create()
form.addContent("name", name)
Local curl:TCurlEasy = TCurlEasy.Create()
' curl.httpHeader(["Content-type: text/html; charset=utf-8"])
curl.setWriteString()
curl.setOptInt(CURLOPT_CONNECTTIMEOUT, 4)
curl.setOptInt(CURLOPT_TIMEOUT, 4)
curl.setOptString(CURLOPT_URL, url)
curl.httpPost(form)
Local res:Int = curl.perform()
If res
Print CurlError(res)
curl.Cleanup()
Return -1
Else
Local str:String = curl.toString()
curl.Cleanup()
Print str
If str.Contains("playerexists")
Return 1
ElseIf str.Contains("playerdoesnotexist")
Return 0
EndIf
End If
Return -1
End Function
Last edited 2011 |
| ||
| Maybe you should use URL escape codes making it something like: CheckPlayerExists("Jos%E9%20Hern%E1ndez") Just guessing... Edit: if that helps out, check this page for all info on URL encoding Last edited 2011 |
| ||
That didn't work either for some reason. Seems php urldecodes things different to how I encoded it. This php function seems to do the trick though:
function fixEncoding($in_str)
{
if(mb_detect_encoding($in_str) == "UTF-8" && mb_check_encoding($in_str,"UTF-8"))
return $in_str;
else
return utf8_encode($in_str);
}
|
| ||
| If you are going to use UTF8 encoding, you need to ensure the string you are sending is UTF8 encoded. The module only does a basic CString conversion. You should be able to do something like :
Local b:Byte Ptr = name.ToUTF8String()
name = String.FromCString(b)
MemFree(b)
form.addContent("name", name)
I wonder if it's worth adding a flag for UTF8 support which will do UTF8 string conversions automagically when it is set... |