PDA

توجه ! این یک نسخه آرشیو شده میباشد و در این حالت شما عکسی را مشاهده نمیکنید برای مشاهده کامل متن و عکسها بر روی لینک مقابل کلیک کنید : تغییر فایل به utf-8 در php



hoka
March 7th, 2017, 02:14
سلام عزیزان

یک دستوری نیاز داریم یک فایلی که موجود هست رو انکودینگش رو به utf-8 تغییر بده . فایل ها زیاد هست نمیدونیم کدوم انکودینگش چی هست شاید utf-8 باشن شاید ansi یا ... . فایل های متنی هستند

shahinmq
March 7th, 2017, 02:34
عرض سلام و احترام :

با استفاده از این کد درون htaccess هر چیزی که به صورت text/plain یا text/html باشد را انکدینگش را بر روی utf8 قرار خواهد داد :



AddDefaultCharset utf-8
php_value default_charset "UTF-8"

اگر می خواهید فقط بر روی یک سری پسوند اعمال شود از این دستور استفاده کنید :


AddCharset utf-8 .html .css .js .xml .json .rss

MJmoonwalk
March 7th, 2017, 03:26
php تغییر انکدودینگ نداره. فقط میتونی نحوه نمایش رو به خروجی مشخص کنی.

Flynic
March 8th, 2017, 12:11
کتابخانه‌ای به نام iconv در php (http://php.net/manual/en/book.iconv.php) وجود دارد که قابلیت تغییر انکودینگ رشته‌ها را دارد.

این کتابخانه در اصل در لینوکس وجود دارد. با bash میتونید یک حلقه برای تبدیل انکودینگ همه‌ی فایل‌ها بنویسید.



iconv -f WINDOWS-1256 -t UTF-8 input.php --output output.php

hoka
March 8th, 2017, 14:55
کتابخانه‌ای به نام iconv در php (http://php.net/manual/en/book.iconv.php) وجود دارد که قابلیت تغییر انکودینگ رشته‌ها را دارد.

این کتابخانه در اصل در لینوکس وجود دارد. با bash میتونید یک حلقه برای تبدیل انکودینگ همه‌ی فایل‌ها بنویسید.



iconv -f WINDOWS-1256 -t UTF-8 input.php --output output.php


بله تمام مطالب موجود در نت مربوط به این کتابخانه + mbstring رو خوندم ولی متاسفانه نتونستم با اینها کدینگ فایل های ascii رو به utf-8 تغییر بدم . فایل هایی که در ادیتور cpanel با این کدینگ باز میشن ANSI_X3.110-1983

چند روز هست که کل مقالات انگلیسی رو دارم میخونم ولی راه حلی در لینوکس نداره متاسفانه این موضوع ولی در ویندوز به راحتی میشه تغییر داد این کدینگ رو به utf-8

Flynic
March 8th, 2017, 15:11
بله تمام مطالب موجود در نت مربوط به این کتابخانه + mbstring رو خوندم ولی متاسفانه نتونستم با اینها کدینگ فایل های ascii رو به utf-8 تغییر بدم . فایل هایی که در ادیتور cpanel با این کدینگ باز میشن ANSI_X3.110-1983

چند روز هست که کل مقالات انگلیسی رو دارم میخونم ولی راه حلی در لینوکس نداره متاسفانه این موضوع ولی در ویندوز به راحتی میشه تغییر داد این کدینگ رو به utf-8

معمولا استفاده از iconv در php برای تغییر انکودینگ «فایل» پیشنهاد نمیشه.
برای فایل‌ها بهتر است از ترمینال دستور رو وارد کنید. فقط لازم هست نوع انکودینگ فعلی درست وارد شود.

اگر تعداد فایل‌ها کم هست هم میتونید با notepad++ یا sublime text 2 انکودینگ‌ها رو تغییر بدید و ذخیره کنید. و برای فایل‌ها زیاد شاید بشود چیزی مثل ماکرو طراحی کرد که خودکار انجام دهد.

hoka
March 8th, 2017, 18:36
معمولا استفاده از iconv در php برای تغییر انکودینگ «فایل» پیشنهاد نمیشه.
برای فایل‌ها بهتر است از ترمینال دستور رو وارد کنید. فقط لازم هست نوع انکودینگ فعلی درست وارد شود.

اگر تعداد فایل‌ها کم هست هم میتونید با notepad++ یا sublime text 2 انکودینگ‌ها رو تغییر بدید و ذخیره کنید. و برای فایل‌ها زیاد شاید بشود چیزی مثل ماکرو طراحی کرد که خودکار انجام دهد.

متاسفانه تعداد فایل ها به شدت بالا هست . حدود 200 هزار فایل یا بیشتر برای همین شدیدا دنبال راهی برای این موضوع هستم که خودکار باشه و مستقیم روی سرور خودم انجام بشه چون کار های دیگه ای هم قرار هست بعد از تغییر انکودینگ روی فایل ها انجام بشه . در مورد ترمینال باز میشه به php متصلش کرد اگر بفرمایید راهش رو ممنون میشم

در مورد ماکرو هم ممنون میشم یک توضیح کوتاهی بفرمایید

hegza
March 8th, 2017, 18:53
یک فایل ایجاد کن که حاوی یک حلقه باشه و دونه دونه فایل های php موجود رو باز کنه و در ابتدای اونا کد زیر قرار بده و بعد مجدد سیوشون کنه

<?php header('Content-type: text/plain; charset=utf-8'); ?>

hoka
March 8th, 2017, 20:29
یک فایل ایجاد کن که حاوی یک حلقه باشه و دونه دونه فایل های php موجود رو باز کنه و در ابتدای اونا کد زیر قرار بده و بعد مجدد سیوشون کنه

<?php header('Content-type: text/plain; charset=utf-8'); ?>

فایل ها text هستند عزیز . مشکل همینجا هست

Flynic
March 8th, 2017, 20:35
متاسفانه تعداد فایل ها به شدت بالا هست . حدود 200 هزار فایل یا بیشتر برای همین شدیدا دنبال راهی برای این موضوع هستم که خودکار باشه و مستقیم روی سرور خودم انجام بشه چون کار های دیگه ای هم قرار هست بعد از تغییر انکودینگ روی فایل ها انجام بشه . در مورد ترمینال باز میشه به php متصلش کرد اگر بفرمایید راهش رو ممنون میشم

در مورد ماکرو هم ممنون میشم یک توضیح کوتاهی بفرمایید

اگر به شل سرور دسترسی دارید با هر زبانی یا حتی خود بَش میتونید یک حلقه بنویسید که این کار رو انجام بده.
دستورش را هم در پست ۴ نوشتم.
ابتدا همین دستور را برای یک فایل اجرا کنید و ببینید تبدیل درست انجام می‌شود یا خیر. (البته تصور میکنم به جای windows-1256 باید ANSI باشد).

در مورد ماکرو منظورم رکورد کردن عملیات انجام تغییر انکودینگ در ادیتور بود. برنامه‌هایی هستند که رکورد می‌کنند و تکرار می‌کنند.
http://www.mouserecorder.com

hoka
March 8th, 2017, 20:46
اگر به شل سرور دسترسی دارید با هر زبانی یا حتی خود بَش میتونید یک حلقه بنویسید که این کار رو انجام بده.
دستورش را هم در پست ۴ نوشتم.
ابتدا همین دستور را برای یک فایل اجرا کنید و ببینید تبدیل درست انجام می‌شود یا خیر. (البته تصور میکنم به جای windows-1256 باید ANSI باشد).

در مورد ماکرو منظورم رکورد کردن عملیات انجام تغییر انکودینگ در ادیتور بود. برنامه‌هایی هستند که رکورد می‌کنند و تکرار می‌کنند.
http://www.mouserecorder.com


ببینید در مورد حلقه و هر چیز دیگه ای ابدا مشکلی نیست . حلقه برای تمامی کارها نوشته شده . همین انکدینگ مورد داره

بنده متوجه شدم مشکل کار iconv چی هست . انکودینگ ورودی رو اشتباه میزدم . انکدینگ رو با mb_detect_encoding میگرفتم و کدینگ رو ascii میداد ولی با ssh و دستور file -i گرفتم utf-16le داد و دستور کامل شد فایل جدید هم utf-8 شد



$string = file_get_contents($str);
$string = iconv('utf-16le', 'UTF-8', $string);
$fp = fopen('123.srt', 'w+');
fwrite($fp, $string);
fclose($fp);



حالا موضوع اینجاست که چطوری کدینگ فایل مبدا رو بدون ترمینال و صحیح مشاهده کنم ؟

آیا راهی غیر از mbstring هست ؟

Flynic
March 8th, 2017, 20:52
دقیقا منظورتون از «بدون ترمینال» رو متوجه نشدم.

اگر منظورتون این هست که چطور ببینید فایل تبدیل شده درست هست، میتونید فایل رو روی سیستم خودتون دانلود کنید و ببینید (با هر چیزی، وب سرور یا sftp).
یا اینکه روی سرور x11 و دسکتاپ نصب کنید و روی همان سرور تست کنید.

چون کاراکتر‌های فارسی در ترمینال نمایش داده نمی‌شوند.

hoka
March 8th, 2017, 22:01
دقیقا منظورتون از «بدون ترمینال» رو متوجه نشدم.

اگر منظورتون این هست که چطور ببینید فایل تبدیل شده درست هست، میتونید فایل رو روی سیستم خودتون دانلود کنید و ببینید (با هر چیزی، وب سرور یا sftp).
یا اینکه روی سرور x11 و دسکتاپ نصب کنید و روی همان سرور تست کنید.

چون کاراکتر‌های فارسی در ترمینال نمایش داده نمی‌شوند.

ببینید منظورم این هست چطوری کدینگ یک فایل رو با php ببینیم ؟

mb_detect_encoding برای اینکار هست ولی متاسفانه دقیق نشون نمیده . مثلا فایلی که utf-16le هست رو ascii نشون میده

Flynic
March 8th, 2017, 22:17
ببینید منظورم این هست چطوری کدینگ یک فایل رو با php ببینیم ؟

mb_detect_encoding برای اینکار هست ولی متاسفانه دقیق نشون نمیده . مثلا فایلی که utf-16le هست رو ascii نشون میده

راستش تا جایی که اطلاع دارم در php همین تابع کاربرد دارد و جایگزینی نمی‌شناسم.

راه دیگه این هست که مثلا شما متن فایل جدید و فایل اصلی (فایل سالم و قابل خواندن فارسی) را دارید، بعد length یا hash هر دو فایل رو محاسبه می‌کنید و تطابق می‌دهید. (یا قسمتی از متن هر دو فایل رو به ASCII حساب کنید و تطابق بدهید).
اینطور فقط می‌تونید صحت کار رو تایید کنید نه نوع انکودینگ رو.