ইউটিএফ -8 পুরো পথ দিয়ে


1190

আমি একটি নতুন সার্ভার সেট আপ করছি এবং আমার ওয়েব অ্যাপ্লিকেশনটিতে সম্পূর্ণ ইউটিএফ -8 সমর্থন করতে চাই। আমি বিদ্যমান সার্ভারগুলিতে অতীতে এটি চেষ্টা করেছি এবং সর্বদা আইএসও -8859-1-এ ফিরে যেতে হবে বলে মনে হয়।

আমার এনকোডিং / চরসেটগুলি ঠিক কোথায় স্থাপন করতে হবে? আমি সচেতন যে এটি করার জন্য আমাকে অ্যাপাচি, মাইএসকিউএল এবং পিএইচপি কনফিগার করতে হবে - আমি অনুসরণ করতে পারি এমন কোনও স্ট্যান্ডার্ড চেকলিস্ট আছে বা সম্ভবত মিল নেই যেখানে সমস্যাগুলি সমাধান করা যায়?

এটি মাইএসকিউএল 5, পিএইচপি, 5 এবং অ্যাপাচি 2 চালিত নতুন লিনাক্স সার্ভারের জন্য।


8
: এখানে সব এনকোডিং ফল্ট সম্পর্কে একটি ওভারভিউ আপনি সম্ভবত করতে পারে sebastianviereck.de/en/...
সেবাস্টিয়ান Viereck

13
এখানে সাধারণভাবে এনকোডিংগুলি এবং বিশেষত পিএইচপি-তে এনকোডিংগুলির একটি পরিচিতি এখানে রয়েছে: প্রতিটি প্রোগ্রামার একেবারে কীভাবে এনকোডিংগুলি এবং পাঠ্যের সাথে কাজ করতে চরিত্রের সেটগুলি সম্পর্কে
ইতিবাচকভাবে প্রয়োজন

পিএইচপি 7 সম্পর্কে সাম্প্রতিক কিছু আলোচনা ইঙ্গিত দেয় যে ২০১০ সালের "আনুষ্ঠানিকভাবে পরিত্যক্ত" অবস্থানের কোনও পরিবর্তন নেই ... " পিএইচপি 7 এবং ইউটিএফ -8" সম্পর্কে আরও কিছু আছে?
পিটার ক্রাউস

এই সমস্যাটি সাধারণ। তবে কোনও শর্টকাট সমাধান নেই, আপনাকে utf-8তাদের প্রত্যেকের জন্য আলাদাভাবে সেটআপ করতে হবে - মাইএসকিউএল 5, পিএইচপি 5 বা আপাচি 2
মণীশ শ্রীবাস্তব

উত্তর:


1014

ডেটা স্টোরেজ :

  • utf8mb4আপনার ডাটাবেসে সমস্ত টেবিল এবং পাঠ্য কলামগুলিতে অক্ষর সেট নির্দিষ্ট করুন । এটি মাইএসকিউএলকে শারীরিকভাবে ইউটিএফ -8 এ স্থানীয়ভাবে এনকোড করা মানগুলি সঞ্চয় এবং পুনরুদ্ধার করে। নোট করুন যে utf8mb4কোনও utf8mb4_*কোলেশন নির্দিষ্ট করা থাকলে (কোনও স্পষ্ট অক্ষরের সেট ছাড়াই) মাইএসকিউএল স্পষ্টভাবে এনকোডিং ব্যবহার করবে ।

  • মাইএসকিউএল (<5.5.3) এর পুরানো সংস্করণগুলিতে, দুর্ভাগ্যক্রমে আপনি সহজভাবে ব্যবহার করতে বাধ্য হবেন utf8, যা কেবল ইউনিকোডের অক্ষরের একটি উপসেটকে সমর্থন করে। আমি যদি মজা করতাম

ডেটা অ্যাক্সেস :

  • আপনার অ্যাপ্লিকেশন কোডে (যেমন পিএইচপি), আপনি যে কোনও ডিবি অ্যাক্সেস পদ্ধতি ব্যবহার করেন না কেন, আপনাকে সংযোগ অক্ষর সেট করতে হবে utf8mb4। এইভাবে, যখন মাইএসকিউএল আপনার অ্যাপ্লিকেশনটিতে এবং তদ্বিপরীত ডেটা বন্ধ করে দেয় তখন তার স্থানীয় ইউটিএফ -8 থেকে কোনও রূপান্তর করে না does

  • কিছু ড্রাইভার সংযোগ অক্ষর সেটটি কনফিগার করার জন্য তাদের নিজস্ব প্রক্রিয়া সরবরাহ করে, যা উভয়ই তার নিজস্ব অভ্যন্তরীণ অবস্থা আপডেট করে এবং সংযোগে ব্যবহৃত এনকোডিংয়ের মাইএসকিউএলকে অবহিত করে — এটি সাধারণত পছন্দসই পদ্ধতি। পিএইচপি-তে:

    • আপনি ব্যবহার করেন, তাহলে PDO পিএইচপি ≥ 5.3.6 সঙ্গে বিমূর্ততা স্তর, আপনি নির্দিষ্ট করতে পারেন charsetমধ্যে DSN :

      $dbh = new PDO('mysql:charset=utf8mb4');
    • আপনি যদি mysqli ব্যবহার করছেন তবে আপনি কল করতে পারেন set_charset():

      $mysqli->set_charset('utf8mb4');       // object oriented style
      mysqli_set_charset($link, 'utf8mb4');  // procedural style
    • যদি আপনি সরল মাইএসকিএল নিয়ে আটকে থাকেন তবে পিএইচপি ≥ 5.2.3 চালিয়ে যাচ্ছেন, আপনি কল করতে পারেন mysql_set_charset

  • চালক সংযোগ অক্ষর সেট সেট করার জন্য নিজস্ব প্রক্রিয়া উপলব্ধ করা হয় না থাকে, তাহলে আপনি মাইএসকিউএল বলতে কিভাবে আপনার আবেদন সংযোগ ডেটা এনকোড করা প্রত্যাশা একটি ক্যোয়ারী জারি করার থাকতে পারে: SET NAMES 'utf8mb4'

  • উপরোক্ত হিসাবে একই ক্ষেত্রে বিবেচনা utf8mb4/ utf8প্রযোজ্য।

আউটপুট :

  • যদি আপনার অ্যাপ্লিকেশনটি অন্য সিস্টেমে পাঠ্য প্রেরণ করে তবে তাদেরকে অক্ষর এনকোডিং সম্পর্কেও জানাতে হবে। ওয়েব অ্যাপ্লিকেশনগুলির সাথে, ব্রাউজারকে অবশ্যই এনকোডিং সম্পর্কে অবহিত করতে হবে যেখানে ডেটা প্রেরণ করা হয়েছে (HTTP প্রতিক্রিয়া শিরোনাম বা এইচটিএমএল মেটাডেটার মাধ্যমে )।

  • পিএইচপি-তে, আপনি default_charsetphp.ini বিকল্পটি ব্যবহার করতে পারেন বা ম্যানুয়ালি নিজেই Content-TypeMIME শিরোনামটি ইস্যু করতে পারেন যা কেবলমাত্র আরও বেশি কাজ তবে একই প্রভাব রয়েছে।

  • ব্যবহার করে আউটপুট এনকোড করার সময় json_encode(), JSON_UNESCAPED_UNICODEদ্বিতীয় প্যারামিটার হিসাবে যুক্ত করুন ।

ইনপুট :

  • দুর্ভাগ্যক্রমে, আপনি যে কোনও জায়গায় সঞ্চয় করার চেষ্টা করার আগে বা এটি যে কোনও জায়গায় ব্যবহার করার আগে আপনার প্রাপ্ত প্রতিটি স্ট্রিং বৈধ ইউটিএফ -8 হিসাবে যাচাই করা উচিত। পিএইচপি এর mb_check_encoding()কৌশলটি করে, তবে আপনাকে এটি ধর্মীয়ভাবে ব্যবহার করতে হবে। এর আশেপাশে আসলে কোনও উপায় নেই, কারণ দূষিত ক্লায়েন্টরা যে কোনও এনকোডিংয়ে যা চান তা ডেটা জমা দিতে পারে এবং পিএইচপি আপনার পক্ষে এটি নির্ভরযোগ্যভাবে করার জন্য আমি কোনও কৌশল খুঁজে পাইনি।

  • বর্তমানের এইচটিএমএল স্পেকটি সম্পর্কে আমার পড়া থেকে , নিম্নলিখিত এইচ -বুলেটগুলি আধুনিক HTML এর জন্য প্রয়োজনীয় বা এমনকি বৈধ নয়। আমার উপলব্ধিটি হ'ল ব্রাউজারগুলি নথির জন্য নির্দিষ্ট করা অক্ষর সেটটিতে ডেটা জমা দিয়ে কাজ করবে submit তবে আপনি যদি HTML এর পুরানো সংস্করণগুলি (এক্সএইচটিএমএল, এইচটিএমএল 4 ইত্যাদি) লক্ষ্য করে থাকেন তবে এই পয়েন্টগুলি এখনও কার্যকর হতে পারে:

    • এইচটিএমএল কেবলমাত্র এইচটিএমএল 5 এর আগে : আপনি ব্রাউজারগুলির দ্বারা আপনাকে পাঠানো সমস্ত ডেটা ইউটিএফ -8 এ থাকতে চান। দুর্ভাগ্যবশত, আপনি নির্ভরযোগ্যভাবে না করার একমাত্র উপায় যেতে এই অ্যাড হয় accept-charsetআপনার সব থেকে অ্যাট্রিবিউট <form>ট্যাগ: <form ... accept-charset="UTF-8">
    • শুধুমাত্র এইচটিএমএল 5 এর আগে এইচটিএমএলের জন্য : নোট করুন যে ডাব্লু 3 সি এইচটিএমএল স্পেক বলে যে ক্লায়েন্টরা সার্ভারে যে ফর্মগুলি সার্ভারে পরিবেশন করেছিল সেগুলিতে ফর্মগুলি প্রেরণ করতে "ডিফল্ট" হওয়া উচিত, তবে এটি দৃশ্যত কেবলমাত্র একটি প্রস্তাবনা, তাই প্রতিটি এককটির উপর স্পষ্ট হওয়ার প্রয়োজন need <form>ট্যাগ।

অন্যান্য কোড বিবেচনা :

  • স্পষ্টতই যথেষ্ট, আপনি পরিবেশন করবেন এমন সমস্ত ফাইল (পিএইচপি, এইচটিএমএল, জাভাস্ক্রিপ্ট, ইত্যাদি) বৈধ ইউটিএফ -8 এ এনকোড করা উচিত।

  • আপনাকে নিশ্চিত করতে হবে যে যতবার আপনি কোনও ইউটিএফ -8 স্ট্রিং প্রক্রিয়া করেন, আপনি নিরাপদে এটি করেন। দুর্ভাগ্যক্রমে, এটি শক্ত অংশ। আপনি সম্ভবত পিএইচপি এর mbstringএক্সটেনশনের ব্যাপক ব্যবহার করতে চাইবেন ।

  • পিএইচপি এর স্ট্রিং অপারেশন বিল্ট-ইন আছে না ডিফল্ট হল UTF-8 নিরাপদ দ্বারা। কিছু সাধারণ জিনিস আপনি পিএইচপি স্ট্রিং অপারেশনের সাথে নিরাপদে করতে পারেন (যেমন কনটেন্টেশন) তবে বেশিরভাগ জিনিসের জন্য আপনার সমতুল্য mbstringফাংশনটি ব্যবহার করা উচিত ।

  • আপনি কী করছেন তা জানতে (পড়ুন: এটিকে জগাখিচুড়ি করবেন না), আপনাকে সত্যিই ইউটিএফ -8 এবং এটি সর্বনিম্নতম স্তরে কীভাবে কাজ করে তা জানতে হবে। আপনার জানা দরকার এমন কিছু ভাল উত্সের জন্য utf8.com থেকে যে কোনও লিঙ্ক চেক করুন ।


4
এটি আমার বোধগম্য যে আপনি যদি কোলেশনটি utf8_ * হিসাবে নির্দিষ্ট করেন তবে এটি স্বয়ংক্রিয়ভাবে utf8 হিসাবেও এনকোড হয়। এটা কি ভুল?
চাজোম্যাটিকাস

49
আমি ভুল নই: কল্ট চার্টেক্টর সেটকে বোঝায়। উদাহরণস্বরূপ দেখুন dev.mysql.com/doc/refman/5.0/en/charset-database.html
চ্যাজোমেটিকস

7
পাশাপাশি অক্ষর সেট করার জন্য PDO উদাহরণ যুক্ত করার বিষয়টি বিবেচনা করুন।
জ্যাক

97
নোট করুন যে মাইএসকিউএল অন্য সবার মতো একই ভাষায় কথা বলে না। মাইএসকিউএল যখন "utf8" বলেছে তখন এর সত্যিকার অর্থে "UTF-8 এর কিছু অদ্ভুতভাবে मंद প্রতিপন্ন রূপ যা forশ্বরের পক্ষে তিন বাইটের মধ্যে সীমাবদ্ধ তা কী হাস্যকর কারণটি জানে"। আপনি যদি সত্যিই ইউটিএফ -8 চান তবে আপনার মাইএসকিউএলকে বলা উচিত যে আপনি এই অদ্ভুত জিনিসটি চান মাইএসকিউএল utf8mb4 কল করতে পছন্দ করে । "ডাব্লুটিএফ!" এস এ সঞ্চয় করতে বিরক্ত করবেন না।
আর মার্টিনহো ফার্নান্দেস

4
এই উত্তরটি আমাকে এতটা সাহায্য করেছিল কিন্তু আমি আরও জানতে পেরেছিলাম যে আমার ক্ষেত্রে আমার পিএইচপি jSON_encode এ JSON_UNESCAPED_UNICODE যুক্ত করার দরকার ছিল যখন এজ্যাক্সের মাধ্যমে ডিবি কোয়েরির ফলাফলগুলি পাস করার সময়।
পেটয় Dec৮

150

আমি চাওম্যাটিকাসের দুর্দান্ত উত্তরে একটি জিনিস যুক্ত করতে চাই :

মেটা ট্যাগটি ভুলে যাবেন না ( এটির মতো, বা এটির HTML4 বা এক্সএইচটিএমএল সংস্করণ ):

<meta charset="utf-8">

এটি তুচ্ছ মনে হচ্ছে, তবে আই 7 এটির আগে আমাকে সমস্যা দিয়েছে।

আমি সব ঠিকঠাক করছিলাম; ডাটাবেস, ডাটাবেস সংযোগ এবং কন্টেন্ট-টাইপ এইচটিটিপি শিরোনাম সবই ইউটিএফ -8 এ সেট করা ছিল এবং এটি অন্যান্য সমস্ত ব্রাউজারগুলিতে দুর্দান্ত কাজ করেছে, তবে ইন্টারনেট এক্সপ্লোরার এখনও "ওয়েস্টার্ন ইউরোপীয়" এনকোডিং ব্যবহারের জন্য জোর দিয়েছিল।

দেখা গেছে যে পৃষ্ঠাটি মেটা ট্যাগটি অনুপস্থিত। সমস্যাটি সমাধান করা যুক্ত করা।

সম্পাদনা:

ডাব্লু 3 সি এর আসলে I18N এর জন্য উত্সর্গীকৃত একটি বৃহত্তর বিভাগ রয়েছে । এই সমস্যা সম্পর্কিত তাদের বেশ কয়েকটি নিবন্ধ রয়েছে - এইচটিটিপি, (এক্স) এইচটিএমএল এবং সিএসএসের বিষয়গুলি বর্ণনা করে:

তারা HTTP শিরোনাম এবং এইচটিএমএল মেটা ট্যাগ উভয়ই ব্যবহার করার পরামর্শ দেয় (বা এক্সএমএল হিসাবে এক্সএমএল হিসাবে এক্সএমএল হিসাবে পরিবেশন করা XML ঘোষণা)।


এইচটিটিপি শিরোনামে চরসেটটি নির্দিষ্ট করাও কি সম্ভব হবে না? সম্ভবত ওয়েবসার্ভারের জন্য কিছু কনফিগার বিকল্পের প্রয়োজন ...
অলিভার

2
@ অলিভার: হ্যাঁ আপনি এটি HTTP শিরোনামে প্রেরণ করতে পারেন, তবে বিষয়বস্তুতে এটি প্রেরণ করা ভাল কারণ ক্লায়েন্ট যদি ফাইলটি সংরক্ষণ করে তবে এটি সর্বদা মেটা ট্যাগটি সংরক্ষণ করবে। এইচটিটিপি শিরোনামটি কেবল অদৃশ্য হয়ে যাবে যদি না ব্রাউজারটি সেভ করা ফাইলে একটি মেটা ট্যাগে অনুলিপি করতে যথেষ্ট স্মার্ট থাকে।

5
এছাড়াও, নিশ্চিত হয়ে নিন যে লাইনটি প্রথম মৌলের উপাদান (কোনও ইউনিকোড স্টাফের আগে) child উপরে বর্ণিত মেটা উপাদানটি হিট করার পরে ব্রাউজারটি পৃষ্ঠাটির পুনরায় ব্যাখ্যা করতে পারে।
অ্যালেক্স

64

default_charsetPhp.ini এ সেট করার পাশাপাশি , আপনি header()কোনও কোড আউটপুটের আগে আপনার কোডের মধ্যে থেকে সঠিক চরসেটটি প্রেরণ করতে পারেন :

header('Content-Type: text/html; charset=utf-8');

পিএইচপি-তে ইউনিকোডের সাথে কাজ করা ততক্ষণ সহজ যখনই আপনি বুঝতে পারবেন যে বেশিরভাগ স্ট্রিং ফাংশন ইউনিকোডের সাথে কাজ করে না, এবং কিছু কিছু পুরোপুরি ম্যাংল স্ট্রিং করে । পিএইচপি "অক্ষরগুলিকে" 1 বাইট দীর্ঘ বলে বিবেচনা করে। কখনও কখনও এটি ঠিক থাকে (উদাহরণস্বরূপ, explode()কেবল একটি বাইট ক্রম সন্ধান করে এবং এটি পৃথককারী হিসাবে ব্যবহার করে - সুতরাং আপনি প্রকৃত চরিত্রগুলি কী সন্ধান করেন তা বিবেচ্য নয়)। তবে অন্য সময়ে, যখন ফাংশনটি আসলে চরিত্রগুলিতে কাজ করার জন্য ডিজাইন করা হয় , পিএইচপি-র কোনও ধারণাই নেই যে আপনার পাঠ্যটিতে ইউনিকোডের সাথে পাওয়া মাল্টি-বাইট অক্ষর রয়েছে।

Phpff8 যাচাই করার জন্য একটি ভাল গ্রন্থাগার । এটি সমস্ত "খারাপ" ফাংশনগুলিকে আবারও লিখে দেয় যাতে আপনি নিরাপদে ইউটিএফ 8 স্ট্রিংয়ে কাজ করতে পারেন। এমবিস্ট্রিং এক্সটেনশনের মতো এক্সটেনশন রয়েছে যা আপনার জন্যও এটি করার চেষ্টা করে তবে আমি লাইব্রেরিটি ব্যবহার করতে পছন্দ করি কারণ এটি আরও বহনযোগ্য (তবে আমি ভর-বাজারের পণ্যগুলি লিখি, তাই এটি আমার পক্ষে গুরুত্বপূর্ণ)। তবে phputf8 পারফরম্যান্স বাড়ানোর জন্য পর্দার আড়ালে এমবিস্ট্রিং ব্যবহার করতে পারে।


Php.ini এ ওভারলোড সেটিংস সেট করুন। মাল্টি-বাইট স্ট্রিং ব্যবহার করার সময় এটি সহায়তা করে।
অ্যান্থনি রাটলেজ

32

আমি কারও সাথে PDO ব্যবহার করে একটি সমস্যা পেয়েছি এবং উত্তরটি ছিল PDO সংযোগ স্ট্রিংয়ের জন্য এটি ব্যবহার করা:

$pdo = new PDO(
    'mysql:host=mysql.example.com;dbname=example_db',
    "username",
    "password",
    array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"));

আমি যে সাইটটি এখান থেকে নেমেছি তা নিচে রয়েছে তবে আমি ভাগ্যক্রমে গুগল ক্যাশে ব্যবহার করে এটি সক্ষম হয়েছি।


1
এটি আরও কিছুটা সন্ধান করে, এটি কেবলমাত্র 5.3.6 এর পূর্বে পিএইচপি সংস্করণগুলির জন্য প্রয়োজনীয়। আরও দেখুন: http://stackoverflow.com/a/4361485/2286722 (যদিও তারা আলাদা ব্যবহার করে $dbh->exec("set names utf8");; আমি এখানে উপস্থাপিত পদ্ধতিটি পছন্দ করি না)। BTW। পিএইচপি ম্যানুয়ালটিতে একটি মন্তব্য হিসাবে এটিতে একটি অনুরূপ নোট রয়েছে: php.net/manual/en/pdo.construct.php#96325
মার্টেন কোয়েটিসিয়র


24

আমার ক্ষেত্রে, আমি ব্যবহার করছিলাম mb_split, যা রেজেক্স ব্যবহার করে। অতএব, আমি নিজে নিজেই তা নিশ্চিত করেছিলাম তা করে রেজেক্স এনকোডিংটি utf-8 ছিলmb_regex_encoding('UTF-8');

পার্শ্ব নোট হিসাবে, আমি এটি mb_internal_encoding()চালিয়েও আবিষ্কার করেছি যে অভ্যন্তরীণ এনকোডিং utf-8 নয়, এবং আমি এটি চালিয়ে পরিবর্তন করেছি mb_internal_encoding("UTF-8");


22

সবার আগে আপনি যদি <5.3PHP তে থাকেন তবে না। সামলাতে আপনার অনেক সমস্যা হয়েছে।

আমি অবাক হয়েছি যে কোনওটিই ইন্টেল গ্রন্থাগারটির উল্লেখ করেনি , এমন একটি যা ইউনিকোড , গ্রাফিম , স্ট্রিং অপারেশন , স্থানীয়করণের জন্য ভাল সমর্থন করে এবং আরও অনেক , নীচে দেখুন।

PHPBenelux'14এলিজাবেথ স্মিথের স্লাইডগুলির দ্বারা আমি পিএইচপি-তে ইউনিকোড সমর্থন সম্পর্কে কিছু তথ্য উদ্ধৃত করব

INTL

ভাল:

  • আইসিইউ লাইব্রেরির চারপাশে মোড়ানো
  • মানকযুক্ত লোকেলস, ​​প্রতি স্ক্রিপ্টে লোকেল সেট করুন
  • সংখ্যা বিন্যাস
  • মুদ্রার বিন্যাস
  • বার্তা বিন্যাস (gettext প্রতিস্থাপন)
  • ক্যালেন্ডার, তারিখ, সময় অঞ্চল এবং সময়
  • Transliterator
  • Spoofchecker
  • রিসোর্স বান্ডিল
  • Convertors
  • আইডিএন সমর্থন
  • Graphemes
  • হালকা খাবার
  • Iterators

খারাপ:

  • Zend_multbite সমর্থন করে না
  • HTTP ইনপুট আউটপুট রূপান্তর সমর্থন করে না
  • ফাংশন ওভারলোডিং সমর্থন করে না

mb_string

  • Zend_multbyte সমর্থন সক্ষম করে
  • এনকোডিং ইন / আউট স্বচ্ছ HTTP সমর্থন করে
  • স্ট্রন্টউপারের মতো ফ্যানশনালটির জন্য কিছু মোড়ক সরবরাহ করে

ICONV

  • চরসেট রূপান্তরকরণের জন্য প্রাথমিক
  • আউটপুট বাফার হ্যান্ডলার
  • মিম এনকোডিং কার্যকারিতা
  • রূপান্তর
  • কিছু স্ট্রিং সহায়ক (লেন, সাবস্ট্র, স্ট্রপোস, স্ট্রপপস)
  • স্ট্রিম ফিল্টার stream_filter_append($fp, 'convert.iconv.ISO-2022-JP/EUC-JP')

ডাটাবেস

  • mysql: টেবিল এবং সংযোগে চারসেট এবং কোলেশন (কোলেশন নয়)। এছাড়াও মাইএসকিএল - এমএসকিলি বা পিডিও ব্যবহার করবেন না
  • postgresql: pg_set_client_encoding
  • স্ক্লাইট (3): এটি ইউনিকোড এবং ইন্টেল সমর্থন সহ সংকলিত হয়েছে তা নিশ্চিত করুন

আরও কিছু গোতচা

  • আপনি যদি তৃতীয় অংশের এক্সটেনশন ব্যবহার না করেন তবে আপনি পিএইচপি এবং উইন্ডো সহ ইউনিকোড ফাইলের নাম ব্যবহার করতে পারবেন না।
  • আপনি যদি এক্সিকিউটিভ, প্রোক_পেন এবং অন্যান্য কমান্ড লাইন কল ব্যবহার করেন তবে ASCII তে সমস্ত কিছু প্রেরণ করুন
  • সাধারণ পাঠ্য সরল পাঠ্য নয়, ফাইলগুলিতে এনকোডিং রয়েছে
  • আপনি আইকনভি ফিল্টার দিয়ে ফ্লাইতে ফাইলগুলি রূপান্তর করতে পারেন

জিনিসগুলি যুক্ত বৈশিষ্ট্যগুলি পরিবর্তন করা ইত্যাদি ক্ষেত্রে আমি এই উত্তরটি আপডেট করব।


2
হ্যাঁ ঠিক. মাইস্ক্লি এবং পিডিও তাদের স্থানীয় চালকদের ব্যবহার করতে পারে। এছাড়াও তারা mysqlnd ড্রাইভার ব্যবহার করতে পারেন যদি আপনি --with-mysqli=mysqlnd --with-pdo-mysql=mysqlndবিকল্পগুলির সাথে পিএইচপি সংকলন করেন ।
আলেকজান্ডার ইয়ানচারুক

14

আমি এই আশ্চর্যজনক উত্তরগুলিতে যুক্ত করব কেবলমাত্র আপনার ফাইলগুলি ইউটিএফ 8 এনকোডিংয়ে সংরক্ষণ করার উপর জোর দেওয়া, আমি লক্ষ্য করেছি যে ব্রাউজারগুলি আপনার কোড এনকোডিং হিসাবে utf8 সেট করার ক্ষেত্রে এই সম্পত্তিটি গ্রহণ করে। যে কোনও শালীন পাঠ্য সম্পাদক আপনাকে এটি দেখায়, উদাহরণস্বরূপ নোটপ্যাড ++ এ ফাইল এনকন্ডিংয়ের জন্য মেনু বিকল্প রয়েছে, এটি আপনাকে বর্তমান এনকোডিং দেখায় এবং আপনাকে এটি পরিবর্তন করতে সক্ষম করে। আমার সমস্ত পিএইচপি ফাইলের জন্য আমি বিওএম ছাড়াই utf8 ব্যবহার করি।

কিছু সময় আগে আমার কাছে কেউ আমাকে অন্য কারও দ্বারা ডিজাইন করা পিএইচপি / মাইএসকিএল অ্যাপ্লিকেশনটির জন্য ইউটিএফ 8 সমর্থন যুক্ত করতে বলেছিল, আমি লক্ষ্য করেছি যে সমস্ত ফাইল এএনএসআইতে এনকোড করা আছে, সুতরাং আমাকে সমস্ত ফাইল রূপান্তর করতে আইসিএনভি ব্যবহার করতে হয়েছে, ডাটাবেস টেবিলগুলি ব্যবহার করতে হয়েছে utf8 চরসেট এবং utf8_general_ci কোলেট, সংযোগের পরে ডাটাবেস অ্যাবস্ট্রাকশন স্তরটিতে 'SET NAMES utf8' যুক্ত করুন (যদি 5.3.6 বা তার আগে ব্যবহার করা হয় তবে আপনাকে সংযোগের স্ট্রিংয়ে চরসেট = utf8 ব্যবহার করতে হবে) এবং পিএইচপি মাল্টিবাইট ব্যবহার করতে স্ট্রিং ফাংশন পরিবর্তন করতে হবে স্ট্রিং ফাংশন সমতুল্য।


13

আমি সম্প্রতি আবিষ্কার করেছি যে strtolower()কোনও বিশেষ চরিত্রের পরে ডেটা কেটে ফেলা হয়েছে এমন ব্যবহারের ফলে সমস্যার সৃষ্টি হতে পারে।

সমাধানটি ব্যবহার করা ছিল

mb_strtolower($string, 'UTF-8');

mb_ মাল্টিবাইট ব্যবহার করে। এটি আরও অক্ষর সমর্থন করে তবে সাধারণভাবে কিছুটা ধীর হয়।


9

আমি ঠিক একই সমস্যাটি পেরেছি এবং পিএইচপি ম্যানুয়ালগুলিতে একটি ভাল সমাধান পেয়েছি।

আমি আমার সমস্ত ফাইল এনকোডিংটি ইউটিএফ 8 এ পরিবর্তন করেছি তারপরে আমার সংযোগে ডিফল্ট এনকোডিং। এটি সমস্ত সমস্যার সমাধান করে।

if (!$mysqli->set_charset("utf8")) {
    printf("Error loading character set utf8: %s\n", $mysqli->error);
} else {
   printf("Current character set: %s\n", $mysqli->character_set_name());
}

উৎস দেখুন


2
আমি যে পৃষ্ঠায় কাজ করছি তাতে একটি এনকোডিং সমস্যা বের করার চেষ্টা করার জন্য আমি এক ঘন্টা ব্যয় করেছি এবং আমি সাধারণত স্টাফগুলি বের করতে বেশ ভাল good আমি সর্বদা এই পৃষ্ঠার সাথে পরামর্শ করি এবং আপনার উত্তর আমাকে অনেক সাহায্য করেছিল। আমার উর্ধ্বতন পেয়েছে। আমার ক্ষেত্রে, set_charset('utf8mb4')কাজ করে নি তবে >set_charset("utf8")করেছে এবং অন্যান্য উত্তরগুলিতে এটি প্রদর্শিত হয়নি।
ফানকি চল্লিশ নিনার

@FunkFortyNiner বিষয়ে সতর্ক থাকুন: set_charset("utf8")কাজ করতে পারে কিন্তু ভিন্নভাবে আচরণ করবে (মধ্যে পার্থক্য সম্পর্কে মন্তব্য দেখতে utf8এবং utf8mb4এবং মাইএসকিউএল সংস্করণ ইতিহাস)। utf8 আপনি যদি করছেন এবং কেবল যদি আপনি জানেন তবে আপনি ব্যবহার করুন !
মার্টিন হেনিংস

5 তারা সমাধান, আমি লাইন দিয়ে একটি পাঠ্য ফাইল লাইন পড়ছিলাম এবং পাচ্ছি? প্রতিটি চরিত্রের জন্য, তারপর আমি আনসির পরিবর্তে, সেফ-এস করলাম, utf8 ব্যবহার করেছি। ধন্যবাদ।
আতেফ ফারুক

8

পিএইচপি-তে, আপনাকে হয় মাল্টিবাইট ফাংশনগুলি ব্যবহার করতে হবে বা mbstring.func_overload চালু করতে হবে । আপনার যদি একাধিক বাইট লাগে এমন অক্ষর থাকে তবে স্ট্র্লেনের মতো জিনিসগুলি কাজ করবে।

আপনার প্রতিক্রিয়াগুলির অক্ষর সেটটি সনাক্ত করতে হবে। আপনি উপরের মতো অ্যাডডেফল্টচরसेट ব্যবহার করতে পারেন, বা পিএইচপি কোড লিখতে পারেন যা শিরোনামটি দেয়। (অথবা আপনি আপনার এইচটিএমএল নথিগুলিতে একটি মেটা ট্যাগ যুক্ত করতে পারেন))


ফানক_ওভারলোড সেটিং সম্পর্কে দুর্দান্ত টিপ - বিদ্যমান কোডটিতে ন্যূনতম পরিবর্তনের অনুমতি দেয়।
সাইমন পূর্ব

4
কেবল সতর্কতা অবলম্বন করুন - কিছু কোড সম্ভবত স্ট্রিং ফাংশনগুলির এক-বাইট-প্রতি-চরিত্রের প্রকৃতির উপর নির্ভর করে।
জেডাব্লু

উপরের @ জেডাব্লু'র মন্তব্যে উল্লিখিত সমস্যাগুলির কারণে, mbstring.func_overload বৈশিষ্ট্যটি পিএইচপি 7.2 হিসাবে অবচয় করা হচ্ছে তা লক্ষ করা গুরুত্বপূর্ণ। সুতরাং সর্বোত্তম পরামর্শটি হ'ল: হ্যাঁ আপনার অবশ্যই mbstring ফাংশনগুলি ব্যবহার করা উচিত, তবে মাল্টিবাইট হিসাবে কাজ করার জন্য স্ট্যান্ডার্ড ফাংশনগুলি পেতে ওভারলোড বৈশিষ্ট্যটি ব্যবহার করবেন না।
সিম্বা

6

পিএইচপি-তে ইউনিকোড সমর্থন এখনও একটি বিশাল গন্ডগোল। যদিও এটি কোনও আইএসও ৮৮৮৯ স্ট্রিং (এটি অভ্যন্তরীণভাবে এটি ব্যবহার করে) ইউটিএফ ৮ তে রূপান্তর করতে সক্ষম, তবে ইউনিকোড স্ট্রিংগুলির সাথে নেটিভভাবে কাজ করার সক্ষমতাটির অভাব রয়েছে যার অর্থ সমস্ত স্ট্রিং প্রসেসিং ফাংশন আপনার স্ট্রিংগুলিকে ম্যাঙ্গাল করে এবং দূষিত করবে। সুতরাং আপনাকে যথাযথ utf8 সমর্থনের জন্য একটি পৃথক গ্রন্থাগার ব্যবহার করতে হবে, বা সমস্ত স্ট্রিং হ্যান্ডলিং ফাংশনগুলি নিজেই পুনরায় লিখতে হবে।

সহজ অংশটি কেবল এইচটিটিপি শিরোলেখগুলিতে এবং ডাটাবেসগুলিতে এবং এর মতো অক্ষরে অক্ষরে উল্লেখ করা হচ্ছে, তবে যদি আপনার পিএইচপি কোডটি বৈধ ইউটিএফ 8 আউটপুট না দেয় তবে তার কোনওটাই বিবেচ্য নয়। এটি শক্ত অংশ, এবং পিএইচপি আপনাকে সেখানে কার্যত কোনও সহায়তা দেয় না। (আমার মনে হয় পিএইচপি 6 এর মধ্যে সবচেয়ে খারাপ সমাধান করার কথা রয়েছে তবে এটি এখনও কিছুটা দূরে রয়েছে)


6

আপনি যদি মাইএসকিউএল সার্ভারটি অক্ষর সেটটি স্থির করতে চান এবং পিএইচপি ক্লায়েন্ট হিসাবে নয় (পুরানো আচরণ; পছন্দসই, আমার মতে), যোগ করার চেষ্টা করুন skip-character-set-client-handshake আপনার সাথে করার করুন my.cnf, নীচে [mysqld]এবং পুনরায় চালু করুন mysql

আপনি ইউটিএফ 8 ব্যতীত অন্য যে কোনও কিছুই ব্যবহার করছেন এমন ক্ষেত্রে এটি সমস্যার সৃষ্টি করতে পারে।


5

শীর্ষ উত্তরটি দুর্দান্ত। নিয়মিত ডিবিয়ান / পিএইচপি / মাইএসকিএল সেটআপে আমার যা যা ছিল তা এখানে:

// storage
// debian. apparently already utf-8

// retrieval
// the mysql database was stored in utf-8, 
// but apparently php was requesting iso. this worked: 
// ***notice "utf8", without dash, this is a mysql encoding***
mysql_set_charset('utf8');

// delivery
// php.ini did not have a default charset, 
// (it was commented out, shared host) and
// no http encoding was specified in the apache headers.
// this made apache send out a utf-8 header
// (and perhaps made php actually send out utf-8)
// ***notice "utf-8", with dash, this is a php encoding***
ini_set('default_charset','utf-8');

// submission
// this worked in all major browsers once apache
// was sending out the utf-8 header. i didnt add
// the accept-charset attribute.

// processing
// changed a few commands in php, like substr,
// to mb_substr

যে সব ছিল !


1

আপনি যদি কোনও মাইএসকিএল সমাধান চান তবে আমার 2 টি প্রকল্পের সাথে একই রকম সমস্যা ছিল একটি সার্ভার স্থানান্তরের পরে। অনুসন্ধান এবং প্রচুর সমাধানের চেষ্টা করার পরে আমি এই একটি / এটি ব্যবহারের আগে কিছুই না পেয়ে এসেছি):

mysqli_set_charset($con,"utf8");

আমার কনফিগার ফাইলে এই লাইনটি যুক্ত করার পরে সবকিছু ঠিকঠাক কাজ করে!

আমি এই সমাধানটি https://www.w3schools.com/PHP/func_mysqli_set_charset.asp এ খুঁজে পেয়েছি যখন আমি এইচটিএমএল কোয়েরি থেকে একটি সন্নিবেশ সমাধান করতে চাইছিলাম

শুভকামনা!


1

শুধু একটি নোট:

আপনি আপনার নন-ল্যাটিন চরিত্রগুলির সমস্যার মুখোমুখি হচ্ছেন ?????????, যেমনটি আপনি একটি প্রশ্ন জিজ্ঞাসা করেছিলেন এবং এটি এই নীতিগত প্রশ্নের উল্লেখ সহকারে বন্ধ হয়ে গেছে, আপনি সমস্ত কিছু চেষ্টা করেছিলেন এবং আপনি এখনও যা পান তা বিবেচনা ??????????করেই নয় MySQL

এটি বেশিরভাগ কারণেই আপনি আপনার পুরানো ডেটা পরীক্ষা করছেন যা ভুল চরসেট ব্যবহার করে ডাটাবেসে প্রবেশ করানো হয়েছে এবং রূপান্তরিত হয়েছে এবং আসলে প্রশ্ন চিহ্নের অক্ষরগুলিতে সঞ্চিত হয়েছে ?। যার অর্থ আপনি আপনার মূল পাঠ্যটি চিরতরে হারিয়েছেন এবং আপনি যা চেষ্টা করবেন তা পাবে না ???????

এই প্রশ্নের উত্তর থেকে আপনি যা শিখেছেন তা তাজা তথ্যতে পুনরায় প্রয়োগ করা আপনার সমস্যার সমাধান করতে পারে।


0

টেবিলগুলি প্রদর্শন করার সময় আমার এই সমস্যাটি ছিল। আমি এটিকে প্রতিটি প্রতিধ্বনি আউটপুট ভেরিয়েবলের উপরে রেখেছি:

<td><?php echo utf8_encode ($Local) ?></td>
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.