الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

مشكلة الترميز وارسال النصوص العربي من الجوال الى صفحة php

مغلق
بدأه زمبقه في 18 نوفمبر 2010 · 6 رد · 1,084 مشاهدة · في JavaME
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم ورحمة الله

(( ارجو من اللي عنده حل لا يبخل علينا بالتعديل المباأأأأأشر على الكود المرفق ))

اخواني قمت بعمل برنامج يقوم بارسال اسم المستخدم وكلمة المرور من الجوال الى صفحة php

مستخدما طريقة GET البرنامج يعمل بشكل جيدع على نسخة الكمبيوتر (jad) حيث

يقوم بارسال بيانات انجليزية وعربية بدون مشاكل

لكن بعد عمل باكينج للبرنامج للحصول على

نسخة الجوال (jar) تفاجت بفشل الاتصال عند ادخال اسم مستخدم عربي او باسورد باللغة العربية بينما يتم الاتصال بنجاح

مع اسم مستخدم وباسورد باللغة الانجليزية

وانا اعتقد المشكلة هي مشكلة encode

حيث اني جربت ارسال هذه الشفرة من الجوال في حقل اسم المستخدم

%D8%B2%D9%85%D8%A8%D9%82%D9%87

الى صفحة البي اتش بي فكانت النتيجة جيدة جدا فوصلت باللغة العربية كتالي : زمبقه

واستخرجت الشفرة السابقه من هذا الموقع

http://meyerweb.com/...tools/dencoder/

وبحثت كثير عن مشكلة الترميز ولكن اغلبها مواقع اجنبية وانا ثقافتي ضعيفه في (( الانجليزية و الجافا ايضا))

وفيما يلي كود البرنامج : ياليت يا ليت اللي عنده الحل يعدل مباشرة على الكود:

import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
import java.io.*;
import javax.microedition.io.*;
import java.util.*;
import java.lang.*;

public class Network extends MIDlet implements CommandListener
{
	Display display;
	Command exitCommand;
	Command updateCommand;
	Form screen;

	public
	TextField inputfield;
	TextField inputfield2;

	TextField outputfield;
	StringItem aboutme = new StringItem("","");
	InputStream in = null;
	String url = new String();


	public Network()
	{

	    // Setup Display
		display = Display.getDisplay(this);
		exitCommand = new Command("اغلاق",Command.EXIT, 1);
		updateCommand = new Command("دخول", Command.SCREEN,2);

		inputfield=  new TextField(" اسم المستخدم:",  "", 256, TextField.ANY);
		inputfield2= new TextField("كلمة السر :", "", 256, TextField.PASSWORD);
		//String s=new String("arabic_string".getBytes(), "UTF-8");		
		outputfield= new TextField("الحاله:", "جاهز", 256, TextField.UNEDITABLE);

		screen = new Form("تسجيل الدخول ");

		screen.append(inputfield);
		screen.append(inputfield2);

		screen.append(outputfield);
		screen.append(aboutme);
		screen.addCommand(exitCommand);
		screen.addCommand(updateCommand);
		screen.setCommandListener(this);




	}



	public void startApp()
	{
	    //Show the Window Form on the Screen
		display.setCurrent(screen);	

	}

	public void pauseApp()
	{

	}

	public void destroyApp(boolean unconditional)
	{

	}

	public void update_action()
	{

		// Create a thread to actually connect to the webserver
		Thread t = new Thread()
		{
			public void run()
			{
				//open connecttion
				//,inputfield.getString(),inputfield2.getString()
				try
				{
					outputfield.setString("جاري الاتصال ...");
		    		url = generateGetUrl("http://h1.ripway.com/oneofmenf6/J2ME/j2me_php_test.php",inputfield.getString(),inputfield2.getString());
					System.out.print("\n" + url + "\n");
					if(updateSite(url)==1)outputfield.setString("تم الاتصال بنجاح ");
					else
						outputfield.setString("فشل الدخوال. =(");

				}		
				catch(IOException e)
				{
					outputfield.setString("فشل الاتصال.  =(");	
				}
			}
		};

		t.start();	
	}

	public void commandAction(Command c, Displayable s)
	{

		if(c==updateCommand)
		{
			update_action();			
		}

		if(c==exitCommand)
		{
			destroyApp(false);
			notifyDestroyed();
		}


	}

	//Function that formats the url string coding (IE %20 for spaces)
	   public String generateGetUrl(String url, String text , String text2)
       {
		String newUrl = new String();
		StringBuffer c = new StringBuffer(text);
		StringBuffer b = new StringBuffer(text2);




		newUrl = url + "?text=" + c.toString() + "&text2=" + b.toString(); 


		return newUrl.toString();

       }


        // This function connects to the site using the HTTP GET method
       public int updateSite(String url) throws IOException
	   {
		HttpConnection conn = null;
		DataOutputStream out = null;

		try
        {
			conn = (HttpConnection)Connector.open(url);
			conn.setRequestMethod(HttpConnection.GET);
			conn.setRequestProperty("Connection", "close");


			if(conn.getResponseCode() == HttpConnection.HTTP_OK)
			{
                //We connected to the site
				return 1;
			}
			else
			{
			    //We didn't connect  =(
				return 0;
			}




		}
		catch(IOException e)
		{
			System.out.print("فشل الاتصال بالسيرفر");
			return 0;
		}

	}

}

تم تعديل هذه المشاركة بواسطة زمبقه في 18 نوفمبر 2010 في 20:12

#2

جرب كدا

import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
import java.io.*;
import javax.microedition.io.*;

/**
 * 
 * @author Mahmoud Kelany
 */
public class Network extends MIDlet implements CommandListener {

	private Display display;
	//Commands
	private Command exitCommand;
	private Command updateCommand;
	//Forms
	private Form screen;
	//Commponents
	private TextField inputfield;
	private TextField inputfield2;
	private TextField outputfield;
	//Others
	private String encodedParamters;
	private String siteURL;
	private int isUpdated;

	public Network() {
    	// Setup Display
    	display = Display.getDisplay(this);
    	exitCommand = new Command("اغلاق", Command.EXIT, 0);
    	updateCommand = new Command("دخول", Command.SCREEN, 0);
    	inputfield = new TextField(" اسم المستخدم:", "", 32, TextField.ANY);
    	inputfield2 = new TextField("كلمة السر :", "", 32, TextField.PASSWORD);
    	outputfield = new TextField("الحاله:", "جاهز", 256, TextField.UNEDITABLE);
    	screen = new Form("تسجيل الدخول ");
    	//////////////////////////////
    	screen.append(inputfield);
    	screen.append(inputfield2);
    	screen.append(outputfield);
    	screen.addCommand(exitCommand);
    	screen.addCommand(updateCommand);
    	screen.setCommandListener(this);
	}

	public void startApp() {
    	display.setCurrent(screen);
	}

	public void pauseApp() {
	}

	public void destroyApp(boolean unconditional) {
	}

	public void updateAction() {
    	siteURL = "http://www.hamzawy.eb2a.com/testJavaME.php";
    	outputfield.setString("جاري الاتصال ...");
    	String paramters = "text=" + inputfield.getString().trim() + "&text2=" + inputfield2.getString().trim();
    	try {
        	encodedParamters = JmeUrlEncoder.encode(paramters);
    	} catch (IOException ex) {
        	ex.printStackTrace();
    	}
    	updateSite();
    	try {
        	Thread.sleep(800);
    	} catch (InterruptedException ex) {
        	ex.printStackTrace();
    	}
    	if (isUpdated == 1) {
        	outputfield.setString("تم التحديث");
    	} else if (isUpdated == -1) {
        	outputfield.setString("فشل الدخوال. =(");
    	} else if (isUpdated == 0) {
        	outputfield.setString("LOL");
    	}
	}

	public void commandAction(Command cmd, Displayable s) {
    	if (cmd == updateCommand) {
        	updateAction();
    	} else if (cmd == exitCommand) {
        	destroyApp(false);
        	notifyDestroyed();
    	}
	}

	private void updateSite() {
    	new Thread() {

        	public void run() {
            	DataOutputStream out = null;
            	HttpConnection conn = null;
            	try {
                	conn = (HttpConnection) Connector.open(siteURL);
                	conn.setRequestMethod(HttpConnection.POST);
                	conn.setRequestProperty("content-type", "application/x-www-form-urlencoded");
                	conn.setRequestProperty("content-length", Integer.toString(encodedParamters.length()));
                	out = conn.openDataOutputStream();
                	out.write(encodedParamters.getBytes());
                	isUpdated = 1;
            	} catch (IOException e) {
                	e.printStackTrace();
                	System.out.print("Error in Server");
                	isUpdated = -1;
            	}
        	}
    	}.start();
	}
}

ودى الكلاس اللى بتعمل تشفير

import java.io.*;

/**
 *
 * @author Mahmoud Kelany
 */
public class JmeUrlEncoder {

	public static String encode(String s) throws IOException {
    	ByteArrayOutputStream bOut = new ByteArrayOutputStream();
    	DataOutputStream dOut = new DataOutputStream(bOut);
    	StringBuffer ret = new StringBuffer(); // return value
    	dOut.writeUTF(s);
    	ByteArrayInputStream bIn = new ByteArrayInputStream(bOut.toByteArray());
    	bIn.read();
    	bIn.read();
    	int c = bIn.read();
    	while (c >= 0) {
        	if ((c >= 'a' && c <= 'z') ||
                	(c >= 'A' && c <= 'Z') ||
                	(c >= '0' && c <= '9') ||
                	c == '.' || c == '-' ||
                	c == '*' || c == '_') {
            	ret.append((char) c);
        	} else if (c == ' ') {
            	ret.append('+');
        	} else {
            	if (c < 128) {
                	appendHex(c, ret);
            	} else if (c < 224) {
                	appendHex(c, ret);
                	appendHex(bIn.read(), ret);
            	} else if (c < 240) {
                	appendHex(c, ret);
                	appendHex(bIn.read(), ret);
                	appendHex(bIn.read(), ret);
            	}
        	}
        	c = bIn.read();
    	}
    	return ret.toString().toUpperCase();
	}

	private static void appendHex(int arg0, StringBuffer buff) {
    	buff.append('%');
    	if (arg0 < 16) {
        	buff.append('0');
    	}
    	buff.append(Integer.toHexString(arg0));
	}
}

بالتوفيق :)

Software Developer
Mahmoudkelany.com


 

#3

السلام عليكم مجددا

وشكرا على سرعه الردود والتفاعل من قبل اعضاء المنتدى

اخي Mahmoud Kelany

الكود الذي وضعته هو للاتصال بطريقة POST على ما اعتقد بينما في الكود تبعي استخدم طريقة GET

وقد قمت بتجريبه مرار ولم انجح....

ولا اعرف السبب لكن ساخبرك ما ذا عملت حتى تكتشفون الخطأ

قمت بعمل مشروع جديد باسم Network وكلاس بنفس الاسم مع تغيير عنوان الموقع داخل الكود طبعا

نسخت الكلاس السابق(كلاس التشفير) الى داخل ملف اسميته JmeUrlEncoder بامتداد java داخل مجلد src بجانب الملف المصدري وقمت باعمل بناء للبرنامج وشغلته لكن لا يقوم بعمل الاتصال مع اني جربت استقبال البيانات بالطريقتين post و get

دون فائده فأين يكمن الخطاء؟؟ او النقص ؟؟

ويا ليت لو تقدر اخي تعدلي على الكود تبعي مع الحفاظ على طريقة ارسال البيانات GET

وتجربه قبل طرحه او اي حد من الاخوة الكرام

هذا موقع اجنبي يشرح جوانب من الموضوع http://book.javanb.com/wireless-java-developing-with-j2me/LiB0121.html#ch15fig02

بس انا ما فهمت منه !!

تم تعديل هذه المشاركة بواسطة زمبقه في 19 نوفمبر 2010 في 02:20

#4

مرحبا اختي ممكن تجربي تغيري الفنكشن التالية لاني وقعت بمشاكل شبيه لمشكلتك:



public int updateSite(String url) throws IOException
{
HttpConnection conn = null;
DataInputStream ins = null;

try
{
conn = (HttpConnection)Connector.open(url);
conn.setRequestMethod(HttpConnection.GET);
conn.setRequestProperty("User-Agent","Profile/MIDP-2.0 Confirguration/CLDC-1.1");
// User-Agent :هذه العبارة مهمة جدا من خلال تجربتي ضعي المواصفات حسب نوع جهازك




if(conn.getResponseCode() == HttpConnection.HTTP_OK)
{
ins = conn.openDataInputStream();
//هذه العبارة تقوم بتنفيذ الرابط وكأنك وضعنيه بالمتصفح
return 1;
}
else
{
//We didn't connect =(
return 0;
}




}
catch(Exception e)
{
System.out.print("فشل الاتصال بالسيرفر");
return 0;
}

}

تم تعديل هذه المشاركة بواسطة boss209 في 19 نوفمبر 2010 في 14:50

#5

ا خي الكريم boss209

اشكرك على التعديل المباشر على الكود ولكن لم تنجح معي الفنكشن حيث اشتغل البرنامج بنفس المشكله القديمه

وانا اعتقد ان المشكلة هي مشكلة ترميز حيث لا يوجد اي مشكلة مع ارسال البيانات الانقليزية فقط المشكلة مع العربي

لاحظ : هذا الرابط عند ارسال بيانات عربي من نسخة الكمبيوتر jad

http://h1.ripway.com/oneofmenf6/J2ME/j2me_php_test.php?text=زمبقه&text2=123

ويتم الاسال بشكل سليم

لكن مع نسخة الجوال jar لا يتم الاتصال اذا كانت البيانات عربيه

متعشمه فيكم الخير ومنتظرة الجواب الشافي .....

واللي يقدر يحل المشكلة ويعمل لي نسخة Jar للجوال ويجربها مع العربي ويطلع له تم التحديث اكووووون له من الشاكرين

تم تعديل هذه المشاركة بواسطة زمبقه في 20 نوفمبر 2010 في 00:38

#6

تفضل المشروع كاملا

MobileAppNetWork.zip

ودى صوره لم بعت البيانات فتحت فالمتصفح كالتالى

post-217802-013452600 1290206442_thumb.p

على فكرا تم فتح هذه الصفحه من داخل الكود

باستخدام

platformRequest(siteURL + "?" + encodedParamters);

لكن طبعا فى الموبيل هيتم فتحها على المتصفح الرئيسى

اتمنى ان تكون اتحلت المشكله

وعدلت لك الكود باستخدام الـ GET method

بالتوفيق :)

المرفقات
Untitled.png

Software Developer
Mahmoudkelany.com


 

#7

الف الف شكرا اخوي Mahmoud Kelany وكل الاخوان اللي ساعدوني في حل المشلكة الف شكر لهم ايضا

وابشركم احتلت المشكله بفضل تفاعل اعضاء هذا المنتدى الرائع

وانا هنا سالخص ما كنت افتقر اليه من معلومات لحل مشكلة ارسال البيانات باللغة العربية :

1- وهي ضرورة وجود كلاس يقوم بتشفير البيانات العربية الى رموز مثل %D8%B2%D9%85%D8%A8%D9%82%D9%87

اي كلاس تشفير يحول النص العربي الى يونيكود (UTF-8) وفيما يلي كلاس التشفير:

يحفظ هذا الكلاس في مجلد src بجانب الملف المصدري بهذا الاسم JmeUrlEncoder.java

واليك كلاس التشفير

import java.io.ByteArrayInputStream; 
import java.io.ByteArrayOutputStream; 
import java.io.DataOutputStream; 
import java.io.IOException; 

public class JmeUrlEncoder { 

        public static String encode(String s, String enc) throws IOException { 
                ByteArrayOutputStream bOut = new ByteArrayOutputStream(); 
                DataOutputStream dOut = new DataOutputStream(bOut); 
                StringBuffer ret = new StringBuffer(); // return value 
                dOut.writeUTF(s); 
                ByteArrayInputStream bIn = new ByteArrayInputStream(bOut.toByteArray()); 
                bIn.read(); 
                bIn.read(); 
                int c = bIn.read(); 
                while (c >= 0) { 
                        if ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') 
                                        || (c >= '0' && c <= '9') || c == '.' || c == '-' 
                                        || c == '*' || c == '_') { 
                                ret.append((char) c); 
                        } else if (c == ' ') { 
                                ret.append('+'); 
                        } else { 
                                if (c < 128) { 
                                        appendHex(c, ret); 
                                } else if (c < 224) { 
                                        appendHex(c, ret); 
                                        appendHex(bIn.read(), ret); 
                                } else if (c < 240) { 
                                        appendHex(c, ret); 
                                        appendHex(bIn.read(), ret); 
                                        appendHex(bIn.read(), ret); 
                                } 
                        } 
                        c = bIn.read(); 
                } 
                return ret.toString().toUpperCase(); 
        } 

        private static void appendHex(int arg0, StringBuffer buff) { 
                buff.append('%'); 
                if (arg0 < 16) { 
                        buff.append('0'); 
                } 
                buff.append(Integer.toHexString(arg0)); 
        } 
}

2 - في الملف المصدري نقوم باستدعى كلاس التشفير كلن حسب طريقة ادخاله للبيانات المراد تشفيرها فمثلا انا كنت اقوم بادخال البيانات من خلال حقول موجوده في فورم وهما كالتالي :

TextField inputfield;
	TextField inputfield2;

فقمت باستدعى كلاس التشفير لتشفير بيانات هذين الحقلين وكنت الطريقة كالتالي :

url = generateGetUrl("http://h1.ripway.com/oneofmenf6/J2ME/j2me_php_test.php"// عنوان الصحفه لا نقوم بتشفيهرها
					,JmeUrlEncoder.encode(inputfield.getString().trim())//استدعا الكلاس لتشفير الحقل الاول
				    ,JmeUrlEncoder.encode(inputfield2.getString().trim()));//استدعى الكلاس لتشفير الحقل  الثاني وهكذا

طبعا كل هذا ما فهمته وطبقته ونجح معي والفضل يعود بعد الله لاعضاء هذا المنتدى الرائع

تذكير : لمشاهدة النتيجة على متصفح الانترنت بشكل سليم غير مرمز يتوجب عليك تغير تشفير المتصفح الى يونيكود

تم تعديل هذه المشاركة بواسطة زمبقه في 20 نوفمبر 2010 في 13:53

هذا الموضوع مغلق.

مواضيع مشابهة

عدد الزوار حالياً

المتواجدون خلال آخر دقيقتين · يتحدّث كل ٣٠ ثانية

—الإجمالي—أعضاء مسجّلون—زوار بدون تسجيل

جارٍ التحقق من المتواجدين…