পিএইচপি স্ট্রিংয়ে ইউনিকোড অক্ষর


164

এই প্রশ্নটি বিব্রতকরভাবে সহজ দেখায়, তবে আমি কোনও উত্তর খুঁজে পাচ্ছি না।

নীচের সি # লাইন কোডের সমতুল্য পিএইচপি কি?

string str = "\u1000";

এই নমুনাটি একটি একক ইউনিকোড অক্ষর সহ একটি স্ট্রিং তৈরি করে যার "ইউনিকোড সংখ্যাসূচক মান" হেক্সাডেসিমালে 1000 (দশমিক 4096) in

এটি, পিএইচপি-তে, আমি কীভাবে একটি একক ইউনিকোড চরিত্রের সাথে একটি স্ট্রিং তৈরি করতে পারি যার "ইউনিকোড সংখ্যাসূচক মান" পরিচিত?



4
@diEcho: এটি কেবল ইউনিকোড অক্ষরের সাথে মিলে যাওয়ার জন্য, তবে ওপি সেই অক্ষরগুলিকে তৈরি করতে চায়।
স্টেফান গেহরিগ

এটি সহায়তা করতে পারে: randomchaos.com/documents/?source=php_and_unicode
diEcho

উত্তর:


178

কারণ জেএসওএন \uxxxxআমার মনে যে প্রথম জিনিসটি আসে সেটি সিনট্যাক্সটিকে সরাসরি সমর্থন করে :

$unicodeChar = '\u1000';
echo json_decode('"'.$unicodeChar.'"');

আরেকটি বিকল্প ব্যবহার করা হবে mb_convert_encoding()

echo mb_convert_encoding('က', 'UTF-8', 'HTML-ENTITIES');

বা ইউটিএফ -16 বিই (বিগ এন্ডিয়ান) এবং ইউনিকোড কোডপয়েন্টের মধ্যে সরাসরি ম্যাপিংয়ের ব্যবহার করুন:

echo mb_convert_encoding("\x10\x00", 'UTF-8', 'UTF-16BE');

9
জেএসএন জাভাস্ক্রিপ্ট নয়।
গম্বো

4
@ গম্বো: আমি জানি তবে এটি এখানে কোনও পার্থক্য করে না। জাভাস্ক্রিপ্ট পাশাপাশি জেএসওএন \uxxxxইউনিকোড সিনট্যাক্সকে সমর্থন করে যাতে আপনি json_decodeএকটি কৃত্রিমভাবে তৈরি জেএসএন স্ট্রিং প্রতিনিধিত্ব নিয়ে কাজ করতে পারেন । আমি শব্দটির পরিবর্তন করেছি যদিও তা স্পষ্ট হয়েছে।
স্টিফান গেহরিগ

3
ঠিক আছে, সুতরাং আমার প্রশ্নের একটি উত্তরের কঠোর সূত্রটি হ'ল: $ str = json_decode ('"\ u1000"'); ধন্যবাদ.
তেলাক্লাভো

আমি চেষ্টা করেছি echo json_decode('\u201B');যা কোন এককhd
উল্টানো উদ্ধৃতিতে রেফার করে

4
আপনি প্রয়োজন echo json_decode('"\u201B"');। ইউনিকোড চিহ্নের চারপাশে ডাবল উদ্ধৃতি বাধ্যতামূলক।
স্টিফান গেহ্রিগ

162

পিএইচপি 7.0.0 চালু করেছে "ইউনিকোড কোডপয়েন্ট এস্কেপ" সিনট্যাক্স

কোনও ফাংশন না ডেকে ডাবল-কোটেড বা হেরডোক স্ট্রিং ব্যবহার করে এখন ইউনিকোড অক্ষরগুলি সহজেই লেখা সম্ভব ।

$unicodeChar = "\u{1000}";

এটি এর মতো ব্যবহার করা যেতে পারে: wordwrap($longLongText, 20, "\u{200B}", true);( শূন্য প্রস্থের স্থান এটি)
সানমাই

5
আমি বিশ্বাস করি যে ওপি এই উত্তর চেয়েছিল, গৃহীত উত্তর নয়। যে কোনও হারে, যখন আমি "পিএইচপি-তে ইউনিকোড" অনুসন্ধান করেছি, কারণ এটি এই উত্তরটি চেয়েছিলাম, গৃহীত উত্তর নয়। এই প্রশ্নটি প্রথম যখন জিজ্ঞাসা করা হয়েছিল তখন সম্ভবত "\ u {abcd।" উপস্থিত ছিল না। যদি তা হয় তবে গৃহীত উত্তরটি এখন সরানো উচিত।
অ্যাডাম চ্যালক্রাফট

23

আমি এখনও অবাক হয়েছি কেন কেন কেউ এখনও এটি উল্লেখ করেনি, তবে আপনি ডাবল উদ্ধৃত স্ট্রিংগুলিতে এস্কেপ সিকোয়েন্স ব্যবহার করে প্রায় সমতুল্য সংস্করণটি করতে পারেন :

\x[0-9A-Fa-f]{1,2}

নিয়মিত প্রকাশের সাথে মিলে যাওয়া অক্ষরের ক্রম হেক্সাডেসিমাল স্বরলিপিতে একটি অক্ষর।

ASCII উদাহরণ:

<?php
    echo("\x48\x65\x6C\x6C\x6F\x20\x57\x6F\x72\x6C\x64\x21");
?>

ওহে বিশ্ব!

সুতরাং আপনার ক্ষেত্রে, আপনার যা করা দরকার তা হ'ল $str = "\x30\xA2";। তবে এগুলি বাইটস , অক্ষর নয়। ইউনিকোড কোডপয়েন্টের বাইট উপস্থাপনাটি ইউটিএফ -16 বড় এন্ডিয়ানের সাথে মিলে যায়, তাই আমরা এগুলি সরাসরি মুদ্রণ করতে পারি:

<?php
    header('content-type:text/html;charset=utf-16be');
    echo("\x30\xA2");
?>

আপনি যদি অন্য কোনও এনকোডিং ব্যবহার করছেন, আপনার সেই অনুযায়ী বাইটগুলি পরিবর্তন করতে হবে (বেশিরভাগই একটি লাইব্রেরি দিয়ে সম্পন্ন করা হয়েছে, যদিও হাতে হাতেও সম্ভব)।

ইউটিএফ -16 ছোট্ট এন্ডিয়ান উদাহরণ:

<?php
    header('content-type:text/html;charset=utf-16le');
    echo("\xA2\x30");
?>

ইউটিএফ -8 উদাহরণ:

<?php
    header('content-type:text/html;charset=utf-8');
    echo("\xE3\x82\xA2");
?>

এখানে packফাংশনটিও রয়েছে তবে আপনি এটি ধীর হয়ে যাওয়ার আশা করতে পারেন।


বুলেট চরিত্রের অনুলিপি / পেস্ট করার জন্য উপযুক্ত (\ xE2 \ x80 \ xA2) উত্স নথিতে একটি ইউটিএফ -8 এনকোডিংয়ের ত্রুটি হতে পারে। ধন্যবাদ.
জিম্প

21

পিএইচপি এই ইউনিকোড এস্কেপ সিকোয়েন্সগুলি জানে না। তবে অজানা পালানোর সিকোয়েন্সগুলি প্রভাবিত না থাকায় আপনি আপনার নিজের ফাংশনটি লিখতে পারেন যা ইউনিকোডের এস্কেপ সিকোয়েন্সগুলিকে রূপান্তর করে:

function unicodeString($str, $encoding=null) {
    if (is_null($encoding)) $encoding = ini_get('mbstring.internal_encoding');
    return preg_replace_callback('/\\\\u([0-9a-fA-F]{4})/u', create_function('$match', 'return mb_convert_encoding(pack("H*", $match[1]), '.var_export($encoding, true).', "UTF-16BE");'), $str);
}

বা এর পরিবর্তে বেনামে ফাংশন এক্সপ্রেশন সহ create_function:

function unicodeString($str, $encoding=null) {
    if (is_null($encoding)) $encoding = ini_get('mbstring.internal_encoding');
    return preg_replace_callback('/\\\\u([0-9a-fA-F]{4})/u', function($match) use ($encoding) {
        return mb_convert_encoding(pack('H*', $match[1]), $encoding, 'UTF-16BE');
    }, $str);
}

এর ব্যবহার:

$str = unicodeString("\u1000");

10
html_entity_decode('&#x30a8;', 0, 'UTF-8');

এটিও কাজ করে। তবে json_decode () সমাধানটি অনেক দ্রুত (প্রায় 50 বার)।


সহজ, মার্জিত, সোজা এবং সম্পূর্ণ সুরক্ষিত পদ্ধতি। +10
andreszs

7

ব্যবহার করে দেখুন পোর্টেবল হল UTF-8 :

$str = utf8_chr( 0x1000 );
$str = utf8_chr( '\u1000' );
$str = utf8_chr( 4096 );

সব ঠিক একই ভাবে কাজ করে। আপনি একটি চরিত্রের কোডপয়েন্ট সাথে পেতে পারেন utf8_ord()পোর্টেবল ইউটিএফ -8 সম্পর্কে আরও পড়ুন


3

অন্যদের দ্বারা উল্লিখিত হিসাবে, পিএইচপি 7 \uসরাসরি ইউনিকোড সিনট্যাক্সের জন্য সমর্থন প্রবর্তন করে।

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

তবে, অন্য একটি বিকল্প আছে। \xবাইনারি পালানোর সাথে সাথে আপনি সরাসরি পিএইচপি-তে অক্ষরটি এনকোড করতে পারেন । \xপালাবার সিনট্যাক্স হয় পিএইচপি 5 এ সমর্থিত

এটি বিশেষত কার্যকর যদি আপনি চরিত্রটির প্রাকৃতিক রূপের মাধ্যমে সরাসরি কোনও স্ট্রিংয়ের মধ্যে প্রবেশ না করতে চান useful উদাহরণস্বরূপ, যদি এটি কোনও অদৃশ্য নিয়ন্ত্রণের অক্ষর হয় বা অন্য সাদা জায়গা সনাক্ত করতে পারে।

প্রথম, একটি প্রমাণ উদাহরণ:

// Unicode Character 'HAIR SPACE' (U+200A)
$htmlEntityChar = "&#8202;";
$realChar = html_entity_decode($htmlEntityChar);
$phpChar = "\xE2\x80\x8A";
echo 'Proof: ';
var_dump($realChar === $phpChar); // bool(true)

নোট করুন, অন্য উত্তরে পেসিয়ারের দ্বারা উল্লিখিত হিসাবে, এই বাইনারি কোডটি একটি নির্দিষ্ট অক্ষরের এনকোডিংয়ের জন্য অনন্য। উপরের উদাহরণে, \xE2\x80\x8Aইউটিএফ -8-তে ইউ + 200 এ জন্য বাইনারি কোডিং।

পরের প্রশ্ন, কিভাবে আপনার কাছ থেকে পেতে পারি হয় U+200Aকরতে \xE2\x80\x8A?

নীচে কোনও জেএসওএন স্ট্রিং, এইচটিএমএল সত্তা বা অন্য কোনও পদ্ধতির উপর ভিত্তি করে যে কোনও অক্ষরের জন্য পালানোর ক্রম উত্পন্ন করার জন্য পিএইচপি স্ক্রিপ্ট দেওয়া আছে যখন একবার আপনি স্থানীয় স্ট্রিং হিসাবে তা পেয়ে যান।

function str_encode_utf8binary($str) {
    /** @author Krinkle 2018 */
    $output = '';
    foreach (str_split($str) as $octet) {
        $ordInt = ord($octet);
        // Convert from int (base 10) to hex (base 16), for PHP \x syntax
        $ordHex = base_convert($ordInt, 10, 16);
        $output .= '\x' . $ordHex;
    }
    return $output;
}

function str_convert_html_to_utf8binary($str) {
    return str_encode_utf8binary(html_entity_decode($str));
}
function str_convert_json_to_utf8binary($str) {
    return str_encode_utf8binary(json_decode($str));
}

// Example for raw string: Unicode Character 'INFINITY' (U+221E)
echo str_encode_utf8binary('∞') . "\n";
// \xe2\x88\x9e

// Example for HTML: Unicode Character 'HAIR SPACE' (U+200A)
echo str_convert_html_to_utf8binary('&#8202;') . "\n";
// \xe2\x80\x8a

// Example for JSON: Unicode Character 'HAIR SPACE' (U+200A)
echo str_convert_json_to_utf8binary('"\u200a"') . "\n";
// \xe2\x80\x8a

0
function unicode_to_textstring($str){

    $rawstr = pack('H*', $str);

    $newstr =  iconv('UTF-16BE', 'UTF-8', $rawstr);
    return $newstr;
}

; URL = '67714eac99c500200054006f006b0079006f002000530074006100740069006f006e003a0020';

প্রতিধ্বনি ইউনিকোড_ টো_টেক্সটস্ট্রিং ($ স্ট্র);

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.