ورود

View Full Version : تابع تبدیل CP1256 به UTF8



rezaTavak
جمعه 06 بهمن 1385, 16:18 عصر
سلام

این تابع هر رشته ای که دارای کد پیج ویندوز عربی یا CP1256 باشد را به کد پیج استاندارد UTF-8 تبدیل میکند.



FUNCTION Cp1256ToUtf8
LPARAMETERS tcString
lcReturnString = ""
FOR i=1 TO LEN(tcString)
lcChar1 = Cp1256ToUtf8No(SUBSTR(tcString,i,1))
DO CASE
CASE LEN(lcChar1)=2
lcChar2 = CHR(EVALUATE("0x"+lcChar1))
CASE LEN(lcChar1)=4
lcChar2 = CHR(EVALUATE("0x"+SUBSTR(lcChar1,1,2)))+;
CHR(EVALUATE("0x"+SUBSTR(lcChar1,3,2)))
CASE LEN(lcChar1)=6
lcChar2 = CHR(EVALUATE("0x"+SUBSTR(lcChar1,1,2)))+;
CHR(EVALUATE("0x"+SUBSTR(lcChar1,3,2)))+;
CHR(EVALUATE("0x"+SUBSTR(lcChar1,5,2)))
ENDCASE

lcReturnString = lcReturnString + lcChar2
NEXT
RETURN lcReturnString




FUNCTION Cp1256ToUtf8No
LPARAMETERS tcChar
LOCAL lcUtf8,lnComma1,lnComma2, lnChar
lnChar = ASC(tcChar)
IF lnChar=0
RETURN "00"
ENDIF
lcUtf8 = "0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09, 0x0A,0x0B,0x0C,0x0D,0x0E,0x0F,"+;
"0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19, 0x1A,0x1B,0x1C,0x1D,0x1E,0x1F,"+;
"0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,0x29, 0x2A,0x2B,0x2C,0x2D,0x2E,0x2F,"+;
"0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39, 0x3A,0x3B,0x3C,0x3D,0x3E,0x3F,"+;
"0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47,0x48,0x49, 0x4A,0x4B,0x4C,0x4D,0x4E,0x4F,"+;
"0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57,0x58,0x59, 0x5A,0x5B,0x5C,0x5D,0x5E,0x5F,"+;
"0x60,0x61,0x62,0x63,0x64,0x65,0x66,0x67,0x68,0x69, 0x6A,0x6B,0x6C,0x6D,0x6E,0x6F,"+;
"0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x77,0x78,0x79, 0x7A,0x7B,0x7C,0x7D,0x7E,0x7F,"+;
"0xE282AC,0xD9BE,0xE2809A,0xC692,0xE2809E,0xE280A6, 0xE280A0,0xE280A1,0xCB86,"+;
"0xE280B0,0xD9B9,0xE280B9,0xC592,0xDA86,0xDA98,0xDA 88,0xDAAF,0xE28098,0xE28099,"+;
"0xE2809C,0xE2809D,0xE280A2,0xE28093,0xE28094,0xDAA 9,0xE284A2,0xDA91,0xE280BA,"+;
"0xC593,0xE2808C,0xE2808D,0xDABA,0xC2A0,0xD88C,0xC2 A2,0xC2A3,0xC2A4,0xC2A5,"+;
"0xC2A6,0xC2A7,0xC2A8,0xC2A9,0xDABE,0xC2AB,0xC2AC,0 xC2AD,0xC2AE,0xC2AF,0xC2B0,"+;
"0xC2B1,0xC2B2,0xC2B3,0xC2B4,0xC2B5,0xC2B6,0xC2B7,0 xC2B8,0xC2B9,0xD89B,0xC2BB,"+;
"0xC2BC,0xC2BD,0xC2BE,0xD89F,0xDB81,0xD8A1,0xD8A2,0 xD8A3,0xD8A4,0xD8A5,0xD8A6,"+;
"0xD8A7,0xD8A8,0xD8A9,0xD8AA,0xD8AB,0xD8AC,0xD8AD,0 xD8AE,0xD8AF,0xD8B0,0xD8B1,"+;
"0xD8B2,0xD8B3,0xD8B4,0xD8B5,0xD8B6,0xC397,0xD8B7,0 xD8B8,0xD8B9,0xD8BA,0xD980,"+;
"0xD981,0xD982,0xD983,0xC3A0,0xD984,0xC3A2,0xD985,0 xD986,0xD987,0xD988,0xC3A7,"+;
"0xC3A8,0xC3A9,0xC3AA,0xC3AB,0xD989,0xD98A,0xC3AE,0 xC3AF,0xD98B,0xD98C,0xD98D,"+;
"0xD98E,0xC3B4,0xD98F,0xD990,0xC3B7,0xD991,0xC3B9,0 xD992,0xC3BB,0xC3BC,0xE2808E,"+;
"0xE2808F,0xDB92,"

lnComma1 = AT(",",lcUtf8,lnChar)
lnComma2 =AT(",",lcUtf8,lnChar+1)
RETURN SUBSTR(lcUtf8,lnComma1+3,lnComma2-lnComma1-3)

binyaz2003
جمعه 06 بهمن 1385, 22:28 عصر
با تشکر از کدتون اما نظرتون راجع به STRCONV( ) چیه؟
فکر کنم یکبار برای تبدیل فارسی که مینوشتم به utf8 ازش استفاده کردم

rezaTavak
شنبه 07 بهمن 1385, 07:56 صبح
متاسفانه درست کار نمیکنه.

چون cp1256 توی این لیست نیست. و البته درست هم تبدیل نمیکنه.
این تابع را قبل از تشکیل xml می توان بکار برد چون فاکس پرو در تابع cursortoxml درست عمل نمیکند.
این هم آدرسی که من از جدولش استفاده کرده ام (opensolaris)

http://src.opensolaris.org/source/xref/g11n/src/lib/iconv/utf-8/binarytables/srcs/CP1256+UTF-8.src

Esikhoob
یک شنبه 12 آبان 1387, 17:04 عصر
با سلام
سئوالی برای من در مورد فارسی ویژوال فاکس پرو(Windows Arabic 1256) و اختلاف آن با UTF8 پیش آمده.
تا به حال فکر میکردم متن فارسی ویژوال فاکس پرو همان UTF8 است
چرا وقتی یک متن فارسی را از Word کپی paste میکنیم در VFP9 ، درست نشان میدهد ؟ مگر متن فارسی Word بر اساس UTF8 نیست؟

البته من حدس میزنم در هنگام کپی کردن از UTF8 به برنامه های غیر UTF8 ، خود ویندوز این تبدیل را انجام میدهد.

rezaTavak
سه شنبه 14 آبان 1387, 07:56 صبح
کلا ویندوز از استاندارد خودش استفاده میکنه. مک هم از خودش. IBM هم از خودش.

UTF مربوط به ISO است که در لینوکس پیش فرض است.
http://en.wikipedia.org/wiki/ISO_8859

Esikhoob
شنبه 09 آذر 1387, 18:15 عصر
سلام
دوست عزیز ، مقاله ای که لینکش را داده بودی خواندم.
یک سئوال برایم ایجاد شد که دوست دارم از شما بپرسم:
2 اصطلاح در متن به کار رفته که فکر میکنم برای درک این استانداردها مهم باشد، فرق این دو اصطلاح چیست:
numeric code points و fixed bit-width value
fixed bit-width value از نظر من همان است که در ASCII قدیمی مورد استفاده بوده

اگر پاسخ بدهید ، خیلی متشکر میشوم.
با تشکر

kia1349
یک شنبه 10 آذر 1387, 07:32 صبح
به نظر من هم همینطوره
اگر سایر دوستان اطلاعاتی دارند ارائه کنند تا استفاده کنیم

Esikhoob
جمعه 22 آذر 1387, 17:25 عصر
تا آنجا که فهمیدم "numeric code points" چیزی نیست بجز همان کد برای کاراکتر.
UTF-8 هم نوع آسان شده (البته هنوز سادگیش را نفهمیدم) از UNICODE هست تا با کدبندیهای قدیمی سازگار باشد و سیستم های بیشتری آن را بفهمند.

Esikhoob
یک شنبه 04 اسفند 1387, 15:36 عصر
از راه ساختن فایلهای txt با متن فارسی و انگلیسی با کد پیج های مختلف و دیدن ظرفیت های آنها و همینطور استفاده از برنامه \microsoft visual foxpro 9\Tools\HexEdit ، به این نتایج دست پیدا کردم :
در 1256 ARABIC و کد پیج ایران سیستم که مورد استفاده فاکس پرو است، هر کاراکتر یک بایت است .
در UTF-8 هر کاراکتر فارسی 2 بایت است در حالی که کاراکتر انگلیسی 1 بایت است.
در UNICODE یا UTF-16 هر کاراکتر(چه فارسی چه انگلیسی) 2 بایت هست.

تا آنجا که من دیدم اینطوری بود ، آیا این صحبتها اشکالی دارد؟

rahro
شنبه 29 خرداد 1389, 19:57 عصر
سلام
ميخام يه متن فارسي رو به يونيكد تبديل كنم از تابع آقاي توكل و همجنين تابع STRCONV استفاده كردم ولي به نتيجه نرسيدم ، كسي از دوستان ميتونه كمك كنه كه مشكل كجاست ؟!