حل کامل مشکل خواندن متن از دیتابیس و نمایش به صورت "؟؟؟؟؟"
به دلیل اینکه خیلی گفتید مشکل داریم و نمیشه ، آموزش تصویری گذاشتم
لازم میدونم این نکته رو هم بگم من دوست ندارم پاسخ ها چند قسمت بشه ، یه داستانی هست ، که پاسخ طولانی بشه ، یا سورس php داخلش باشه یا ... جواب رو نشون نمیده ، پس مجبور میشم ویرایش کنم و پاسخ چندبخشی بشه ، این موضوع از تعداد دفعات ویرایش واضح هست
برای حل مشکل نمایش فارسی ، تمام موارد ذکر شده رو گام به گام انجام بدید
- از ومپ 2.2 استفاده کنید ، که مشکلی در راه اندازی سرویس ها در نسخه ها ی مختلف ویندوز وجود نداشته باشه
برای شروع ، باید یک دیتابیس با قالب UTF-8 بسازیم ، که مثل تصویر عمل میکنیم
خوب ، حتی این قابلیت وجود داره که دیتابیسی که از قبل ساخته شده رو ut8_general_ci کرد که طبق تصویر بعد از انتخاب دیتابیس به قسمت operations میریم
مرحله ی بعد ساخت جدول utf8_general_ci هست که در تصویر ساخته شده ، به قسمت collation در تصویر توجه کنید که utf8 هست
تغییر collation جدولی که از قبل ساختید هم مثل دیتابیس در همون قسمت oprations بعد از انتخاب جدول قابل انجام هست
اگر تا اینجا مراحل رو درست انجام داده باشید ، اطلاعات جدول باید به این شکل باشه ، ( اگر از روش تغییر استفاده کردید ، ممکنه اطلاعات درست نمایش داده نشه و نیاز به ایمپورت یا اینسرت مجدد داشته باشه ، پس با یک رکورد آزمایشی ، نتیجه رو چک کنید)
خوب برای درک بهتر کد php که اکثر دوستان در این قسمت مشکل داشتند ، من در دوفایل php مجزا کار کردم ، یکی خروجی به صورت ????? و یکی هم به صورت uft-8
کد php که هیچ کاری برای فارسی سازی روش انجام نشده این هست (کامت ها رو بخونید ، متوجه بشید موضوع چیه ، ساده نوشتم)
<?php $c if($conn){ // database connection is passed mysql_select_db("uncocoder"); $command= mysql_query("SELECT * FROM tblmain"); if($command){ //query runed with out error while($row=mysql_fetch_array($command)){ echo $row['id']."<br>"; echo $row['age']."<br>"; echo $row['name']."<br>"; echo "<hr>"; } } else{ //query catched an error echo mysql_error(); } } else{ // database connection is failed echo mysql_error(); } ?>
خروجی کد بالا این تصویر هست
همون طور که می بینید ، ???? ها به جای متن فارسی خودنمایی میکنن ! ، حالا برای رفع این مشکل باید 2 کار انجام بدیدم
- به صفحه ی php بفهمونیم که محتوای utf-8 داره
- به mysql بفهمونیم که ما میخوایم محتوا رو به صورت utf-8 بخونیم
اولین مورد رو در آغاز صفحه انجام میدیم یعنی بعد از باز شدن تگ php
مورد دوم رو بعد از برسی ارتباط با DataBase انجام میدیم
<?php //////////////////////////////////////////////// header('Content-Type: text/html; charset=utf-8'); //---------------------------------------------// $c if($conn){ // database connection is passed //////////////////////////////////////////////// // now set set encoding here mysql_query("SET NAMES 'utf8'"); // you can remove this line , but it's better leave it here as know it is //because of other Apache versions mysql_set_charset("UTF8"); //---------------------------------------------// // database connection is passed mysql_select_db("uncocoder"); $command= mysql_query("SELECT * FROM tblmain"); if($command){ //query runed with out error while($row=mysql_fetch_array($command)){ echo $row['id']."<br>"; echo $row['age']."<br>"; echo $row['name']."<br>"; echo "<hr>"; } } else{ //query catched an error echo mysql_error(); } } else{ // database connection is failed echo mysql_error(); } ?>
خوب حالا خروجی کد ما میشه این تصویر
من برای واضح تر شدن تصویر و کد ، اونها رو در چند خط و با یک hr از هم جدا کردم ، شما برای ارسال به برنامه ی اندرویدتون نیازی بهش ندارید و فقط باید اون ها رو داخل یه آرایه بریزید و json_encode کنید ، خیلی ها این مشکل رو دارن که متن فارسی درسته نشون داده میشه json_encode واضح نیست ، مثل تصویر زیر که name ها json_encode شده اند
همون طور که می بینید ، من کد شده واضح نیست ، و این دقیقا مفهوم encode رو میرسونه ، جای نگرانی نیست ، وقتی تو جاوا decode کنید ، متن بدون مشکل قابل استفاده خواهد بود
تنها موردی که باقی می مونه اینه که شما برای ارسال مقدار های فارسی به سمت سرور باید اونها رو utf-8 تعریف کنید ، پس باید کد استاد که توی ویدئو ها به این شکل هست :
HttpClient client =newDefaultHttpClient(); HttpPost method =newHttpPost(url); if(params!=null){ method.setEntity(newUrlEncodedFormEntity(params)); }
به این شکل تغییر داد
HttpClient client =newDefaultHttpClient(); HttpPost method =newHttpPost(url); if(params!=null){ method.setEntity(newUrlEncodedFormEntity(params,"UTF-8")); }
دیگه واقعا نمی دونم چی بگم :| ، فکر کنم مثل روز روشن بود که جواب میده پس نیازی به روش های عجیب غریب ، یا حتی غریب عجیب (نمی دونم شاید هم قریب عجیب ) نیست :))
موفق باشید
این از مشکلم
اینم از کدم
<?php
header('Content-Type: text/html; charset=utf-8');
if (isset($_REQUEST['action'])){
$action = $_REQUEST['action'];
} else {
echo "Invalid Data";
exit;
}
if ($action=="read"){
read();
}
/**
*
*/
function connectToDatabase(){
$connection=mysqli_connect("localhost", "root", "", "qchat_db");
if (mysqli_connect_errno()) {
echo "Failed to connect to MySQL: " . mysqli_connect_error();
}
return $connection;
}
/**
*
*/
function read(){
$connection = connectToDatabase();
mysql_query("SET NAMES 'utf8'");
mysql_set_charset("UTF8");
$result = mysqli_query($connection, "SELECT * FROM sabtnam ");
$sabtnam = array();
while($row = mysqli_fetch_array($result)) {
$record = array();
$record['id'] = $row['id'];
$record['user'] = $row['user'];
$record['pass'] = $row['pass'];
$record['jens'] = $row['jens'];
$record['tavalod_sal'] = $row['tavalod_sal'];
$record['tavalod_mah'] = $row['tavalod_mah'];
$record['tavalod_ruz'] = $row['tavalod_ruz'];
$record['shahr'] = $row['shahr'];
$sabtnam[] = $record;
}
echo json_encode($sabtnam);
mysqli_close($connection);
}
دوستان کد قبلی رو با mysql نوشته بودم این رو با mysqli چون الان mysql خیلی وقت ها کار نمیکنه !
این سورس کد php + فایل بک آپ دیتابیس + screenshot خروجی
با سلام
برای دوستانی که سریعتر دنبال جواب اند:
$connection = mysqli_connect("localhost", "username", "password", "db");
mysqli_set_charset($connection, 'utf8');
مشکل از کجاست؟
public static String readUrl(String URL, ArrayList<NameValuePair> params) { try { HttpClient client = new DefaultHttpClient(); HttpPost method = new HttpPost(URL); if (params != null) { method.setEntity(new UrlEncodedFormEntity(params, "UTF-8")); } HttpResponse response = client.execute(method); InputStream inputStream = response.getEntity().getContent(); String result = convertInputStreamToString(inputStream); return result; } catch (ClientProtocolException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return null; }
سلام . دوستانی که هنوز درگیره این مطلب هستن من همین مشکل رو داشتم و چون از پروسیجر استفاده میکردم و تعداد فانکشن هام زیاد بود تو فانکشنی که اتصال به دیتابیس رو براش نوشتم بعد از اتصال به دیتابیس این کد رو اضافی کردم هیچ کد دیگه ای هم نیاز نیست و مشکلم حل شد .
$con->set_charset('utf8');
البته توجه داشته باشید شما موقع گرفتن خروجی json به این صورت میبینید ولی در کلاینت کاملا صحیح نشون داده میشود
مثلا کلمه تهران : \u062a\u0647\u0631\u0627\u0646
دوستان سلام ..من توی مرورگر جیسون روencode شده میگیرم ...مثلا کلمه تهران دقیقا مانند :u062a\u0647\u0631\u0627 /u0646درمرورگر نشون میده ولی در لیست ویو هنوز علامت سوال ؟؟؟؟ نشون میده...دردیتابیس سرور کلمات هم بصورت فارسی درست ثبت میشه ..
در کلاس سمت اندروید که اطلاعات رو میفرسته ..utf8 هست چون درست ثبت میشه ..اطلاعات در یافتی رو از یه کلاس دیگه میگیرم بنام jsonparserاینم کد..:
public class JSONParser {
static InputStream is = null;
static JSONObject jObj = null;
static String json = "";
// constructor
public JSONParser() {
}
public JSONObject getJSONFromUrl(String url, int connectionTimeout, int socketTimeout) {
// Making HTTP request
try {
// defaultHttpClient
String data = null;
ArrayList<NameValuePair> inputArguments;
inputArguments = new ArrayList<NameValuePair>();
// add parameters for website query string
inputArguments.add(new BasicNameValuePair("parameter", "value"));
HttpParams params = new BasicHttpParams();
HttpClient client = new DefaultHttpClient(params);
HttpPost request = new HttpPost(url);
request.setEntity(new UrlEncodedFormEntity(inputArguments, "UTF-8"));
HttpResponse httpResponse = (HttpResponse) client.execute(request);
HttpEntity httpEntity = httpResponse.getEntity();
// data = streamToString(httpResponse.getEntity().getContent());
////////////////////////////////////////////////////
is = httpEntity.getContent();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
try {
BufferedReader reader = new BufferedReader(new InputStreamReader(
is, "iso-8859-1"), 8);
StringBuilder sb = new StringBuilder();
String line = null;
while ((line = reader.readLine()) != null) {
sb.append(line + "\n");
}
is.close();
json = sb.toString();
} catch (Exception e) {
Log.e("Buffer Error", "Error converting result " + e.toString());
}
// try parse the string to a JSON object
try {
jObj = new JSONObject(json);
} catch (JSONException e) {
Log.e("JSON Parser", "Error parsing data " + e.toString());
}
// return JSON String
return jObj;
}
}
جیسون دریافتی دریه کلاس دیگه به این شکل انکد میشه..
jsonobj2[i] = new String(c.getString(json_node_2).getBytes("ISO-8859-1"), "UTF-8");
می تونید از این شمای برای ساخت جداول MySQL استفاده کنید... فقط مقدار ENGINE رو به نوع جدولتون تغییر بدید (MyISAM, INODb, Archive...):
create table `tbl_test`
(
...
) engine = 'myisam' row_format = default auto_increment = 0 default character set = 'utf8' collate = 'utf8_general_ci';
اول اینکه Java رشته ها رو بصورت Unicode هندل می کنه، در صورتی که JSON بصورت UTF8 (و بیشتر)
پس: اول مطمعن شو که فونتی که باهاش نمایش میدی با UTF8 سازگار باشه و می تونه UTF8 نشون بده.
دوم شاید مجبور باشی رشته ها و متون رو به UTF8 تبدیل کنی... این یه راه سادشه:
import java.nio.charset.Charset;
private final Charset CHARSET = Charset.forName("UTF-8");
String decodeUTF8(byte[] bytes)
{
return (new String(bytes, CHARSET));
}
byte[] encodeUTF8(String string)
{
return string.getBytes(CHARSET);
}
jsonobj2[i] = new String(c.getString(json_node_2).getBytes("ISO-8859-1"), "UTF-8");
function connectToDatabase(){
$connection = mysqli_connect("localhost", "root", "pass", "root"); mysqli_set_charset($connection,"utf8"); if (mysqli_connect_errno()) { echo "Failed to connect to MySQL: " . mysqli_connect_error(); } return $connection; }
در سمت اندروید کد اول و در سمت سرور کد دوم رو وارد کردم ، زمان ذخیره درست کار میکنه ولی وقتی میخوام رکورد خاصی رو حذف یا آپدیت کنم از لیست ویو حذف یا آپدیت میشه ولی از دیتابیس سرور نه
ولی قبل از استفاده از کد اول درست کار میکرد و با گذاشتن اون کد دستور حذف و آپدیت درست کار نمیکنه
لطفا راهنمایی کنید؟
method.setEntity(new UrlEncodedFormEntity(params, "UTF-8"));
mysqli_set_charset($connection, 'utf8');
من تمام این راههایی که دوستان گفتن رو رفتم اما بازهم جواب نگرفتم.
شکل نوشته ها از ؟؟؟؟ به یه سری علامت های گنگ مثل آلبانی تغییر کرده .
کد php:
<?php
$conn = new mysqli("localhost", "root", "", "euro16");
mysqli_set_charset($conn, 'utf8');
if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
}
$sql = "SELECT game1, game2, game3 FROM tablegame";
$result = $conn->query($sql);
if ($result->num_rows > 0) {
while($row = $result->fetch_assoc()) {
echo "bazi: " . $row["game1"]. " bazi: " . $row["game2"];
}
} else {
echo "0 results";
}
$conn->close();
?>
پاسخگویی و مشاهده پاسخ های این سوال تنها برای اعضای ویژه سایت امکان پذیر است .
چنانچه تمایل دارید به همه بخش ها دسترسی داشته باشید میتوانید از این بخش لایسنس این آموزش را خریداری نمایید .