এই ইউনিকোডের অক্ষরগুলির সংমিশ্রণগুলির কী হবে এবং আমরা কীভাবে সেগুলি ফিল্টার করতে পারি?


91

ก้้้้้้้้้้้้้้้้้้้้ ก็็็็็็็็็็็็็็็็็็็็ ก็็็็็็็็็็็็็็็็็็็็ กิิิิิิิิิิิิิิิิิิิิ ก้้้้้้้้้้้้้้้้้้้้ ก็็็็็็็็็็็็็็็็็็็็ กิิิิิิิิิิิิิิิิิิิิ ก้้้้้้้้้้้้้้้้้้้้ กิิิิิิิิิิิิิิิิิิิิ ก้้้้้้้้้้้้้้้้้้้้ ก็็็็็็็็็็็็็็็็็็็็ กิิิิิิิิิิิิิิิิิิิิ ก้้้้้้้้้้้้้้้้้้้้ ก็็็็็็็็็็็็็็็็็็็็ ก็็็็็็็็็็็็็็็็็็็็ กิิิิิิิิิิิิิิิิิิิิ

এগুলি সম্প্রতি ফেসবুক মন্তব্য বিভাগে প্রদর্শিত হয়েছে।

আমরা কীভাবে এটি স্যানিটাইজ করতে পারি?


4
আপনি এই প্রশ্ন আগে জিজ্ঞাসা করা হয়নি? (সৎ প্রশ্ন।)
রাই-

4
এগুলি সর্বাধিক ascii নয়
ক্রিস এবারলে

31
কেন সমাপ্ত ভোট? এটি একটি প্রোগ্রামিং-সম্পর্কিত প্রশ্ন, যেমন আমি কীভাবে এই ধরণের ইনপুট স্যানিটাইজ করতে জানতে চাই যাতে আমার ওয়েবসাইটে মন্তব্য বিভাগগুলি 13 বছরের পুরানো খেলার মাঠ হবে না ...
এক্সসিএসে

17
"ก้้้้้้้้้้้้้้้้้้้้ ก้้้้้้้้้้้้้้้้้้้้ ก็็็็็็็็็็็็็็็็็็็็ ก็็็็็็็็็็็็็็็็็็็็ กิิิิิิิิิิิิิิิิิิิิ ก้้้้้้้้้้้้้้้้้้้้ ก็็็็็็็็็็็็็็็็็็็็ กิิิิิิิิิิิิิิิิิิิิ ก้้้้้้้้้้้้้้้้้้้้ กิิิิิิิิิิิิิิิิิิิิ ก้้้้้้้้้้้้้้้้้้้้ ก็็็็็็็็็็็็็็็็็็็็ ก็็็็็็็็็็็็็็็็็็็็ ก็็็็็็็็็็็็็็็็็็็็ กิิิิิิิิิิิิิิิิิิิิ ก้้้้้้้้้้้้้้้้้้้้ ก็็็็็็็็็็็็็็็็็็็็ กิิิิิิิิิิิิิิิ กิิิิิิิิิิิิิิิ" সুতরাং আমার ওয়েবসাইটের মন্তব্য বিভাগগুলি 13 বছরের পুরানো খেলার মাঠ হবে না। " প্রকৃতপক্ষে স্যানিটাইজেশন ছাড়াই এই অক্ষরগুলি পোস্ট করে এটি উপরে মন্তব্যটি অপঠনযোগ্য করে তুলতে পারে, যা মোটেই সন্তুষ্ট ব্যবহারকারীদের অভিজ্ঞতা নয়।
এক্সসিএস 22

14
@pjotr এটি অবশ্যই ব্রাউজার বাগ নয়। আপনি যদি চান অক্ষরগুলিকে থাকা বাক্সটি উপচে না ফেলে আপনি কেবল এটি CSS এর মাধ্যমে সমাধান করতে পারেন (ওভারফ্লো: লুকানো;) ...
এক্সসিএস

উত্তর:


80

এই ইউনিকোড চরিত্রগুলির সাথে কী হবে?

এটি একটি চরিত্রের সমন্বয়যুক্ত চরিত্রগুলির একটি ধারাবাহিক । যেহেতু প্রশ্নের মধ্যে সম্মিলিত অক্ষরগুলি বেস চরিত্রের উপরে যেতে চায়, তারা স্ট্যাক আপ (আক্ষরিক)। উদাহরণস্বরূপ, ক্ষেত্রে

ก้้้้้้้้้้้้้้้้้้้้

... এটি একটি ก (থাই চরিত্র কো কাই ) ( U + 0E01 ) এর পরে থাই সমন্বিত অক্ষর মাই থো ( ইউ + 0 ই 49 ) এর 20 টি অনুলিপি রয়েছে ।

আমরা কীভাবে এটি স্যানিটাইজ করতে পারি?

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

বিটিডাব্লু, আপনি যদি কখনও জানতে চান যে কোনও চরিত্রটি কীভাবে রচিত হয়েছিল, অন্য একটি প্রশ্নের জন্য আমি সম্প্রতি জেএসবিনে একটি দ্রুত এবং নোংরা "ইউনিকোড শো মি" পৃষ্ঠাটি কোড করেছি। আপনি কেবল পাঠ্য অঞ্চলে পাঠ্যটি অনুলিপি করুন এবং পেস্ট করুন এবং এটি আপনাকে প্রতিটি কোড পয়েন্ট (~ অক্ষর) দেখায় যা পাঠ্যটি তৈরি করা হয়েছে, প্রতিটি পৃষ্ঠার উপরের পৃষ্ঠাগুলির মতো লিঙ্কগুলির সাথে প্রতিটি অক্ষর বর্ণিত হয়েছে। এটি কেবল ইউ + এফএফএফএফ এবং এর নিচে রেঞ্জের কোড পয়েন্টগুলির জন্য কাজ করে, কারণ এটি জাভাস্ক্রিপ্টে লেখা হয়েছে এবং জাভাস্ক্রিপ্টে ইউ + এফএফএফএফের উপরে বর্ণগুলি পরিচালনা করতে আপনাকে এই প্রশ্নের জন্য যা করতে চেয়েছিলাম তার চেয়ে বেশি কাজ করতে হবে (কারণ জাভাস্ক্রিপ্টে, একটি "চরিত্র" সর্বদা হয় 16 বিট, যার অর্থ কিছু ভাষার জন্য একটি অক্ষর দুটি পৃথক জাভাস্ক্রিপ্ট" অক্ষর "জুড়ে বিভক্ত করা যেতে পারে এবং আমি এর জন্য অ্যাকাউন্ট করি নি), তবে এটি '


4
আপনি কি কেবল একই সংযুক্ত কোডপয়েন্টের পুনরাবৃত্তি অনুলিপিগুলি কোনও একক অনুলিপিতে মুছবেন না? আপনি কখন একবার একই কোডপয়েন্টটি বেস কোড কোডেপয়েন্টে একাধিকবার সংমিশ্রিত করতে প্রয়োজন?
রেমি লেবুউ

4
@ রেমিলিউউ: "আপনি কখন একই কোডপয়েন্টকে বেস কোডের সাথে একাধিকবার সংমিশ্রণ করতে পারবেন?" আমি জানি না, উদাহরণস্বরূপ, আপনি অন্যান্য ভাষা কীভাবে লেখেন সে সম্পর্কে খুব কমই জানি Thai একই কোড পয়েন্টের একাধিকের মধ্যে কিছুতে বৈধ ছিল তা জানতে পেরে আমি মোটেও অবাক হব না। তবে এটি জটিলতা হ্রাস করে না; কোনটি অক্ষর সমন্বয় করছে তা নির্ধারণ করার জন্য আপনার এখনও ইউনিকোড সারণীর একটি দরকার।
টিজে ক্রাউডার

আমি আপনার পৃষ্ঠাটি ইউআরএল থেকে ইউনিকোড স্ট্রিং গ্রহণ করতে তৈরি করেছি যেমন jsbin.com/erajer/7/…
ubershmekel


জাভাস্ক্রিপ্ট UTF-16 ব্যবহার করে « সারোগেট জোড়া »
ডলম্যান

17

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

#!/usr/bin/perl
use strict;
use utf8;

binmode(STDOUT, ':utf8');

my $string = "กิิ ก้้ ก็็ ก็็ กิิ ก้้ ก็็ กิิ ก้้ กิิ ก้้ ก็็ ก็็ กิิ ก้้ ก็็ กิิ ก้้";
$string =~ s/(\p{Mark})\p{Mark}+/$1/g; # Strip excess combining marks
print("$string\n");

এটি মুদ্রণ করবে:

ก้ ก็ ก็ กิ ก้ ก็ กิ ก้ กิ ก้ ก็ กิ ก้ ก้ ก็ กิ


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

4
আপনি ঠিক বলেছেন, একাধিক সংমিশ্রনের চিহ্নগুলি বৈধ বলে অবশ্যই কিছু ক্ষেত্রে রয়েছে। তবে আপনি সুনির্দিষ্ট সর্বাধিক চিহ্নের অনুমতি দেওয়ার জন্য সহজেই রেজেক্স পরিবর্তন করতে পারেন।
নয়েলহোহফ

উত্সাহিত করা হয়েছে কারণ এটি 'আপনি কীভাবে এই স্যানিটাইজ করবেন' প্রশ্নের উত্তর দেয়। তবে আমি মনে করি এটি রক্ষণাবেক্ষণের দুঃস্বপ্ন হবে।
ফ্লিপএমসিএফ

এছাড়াও, আরই কেবল সংলগ্ন সদৃশ অপসারণ করে । এটা তোলে পরিষ্কার না, বলে, <base><macron><overline><macron><overline>...। সুতরাং, যদি আপনার পাঠ্যের একাধিক পৃথক সংমিশ্রণযুক্ত অক্ষর প্রয়োজন হয় তবে তা সূক্ষ্মভাবে অতিক্রম করবে; এবং দূষিত পাঠ্য এখনও নির্মিত যেতে পারে।
জেসি চিশলম

13

"আমরা কীভাবে এটি স্যানিটাইজ করতে পারি" টিজের ক্রোডার সর্বোত্তম উত্তর দিয়েছেন

যাইহোক, আমি মনে করি স্যানিটাইজেশনটি ভুল পদ্ধতির, এবং ক্রিস্টির সাথে overflow:hiddenসিএসএস উপাদান রয়েছে।

কমপক্ষে, আমি এটি সমাধান করছি।


6

ঠিক আছে এইটা বুঝতে পেরে আমাকে কিছুটা সময় লেগেছে, আমি ছাপে ছিলাম যে জালগো উত্পাদনের জন্য অক্ষরগুলির সংমিশ্রণগুলি এগুলির মধ্যে সীমাবদ্ধ । সুতরাং আমি প্রত্যাশা করেছি রেজিক্স অনুসরণ করার জন্য ফ্রেইকগুলি ধরতে।

([\u0300–\u036F\u1AB0–\u1AFF\u1DC0–\u1DFF\u20D0–\u20FF\uFE20–\uFE2F]{2,})

এবং এটি কাজ করে না ...

ক্যাচটি হ'ল উইকির তালিকায় সম্মিলিত অক্ষরের পুরো পরিসর আবরণ করা যায় না।

আমাকে কী ইঙ্গিত দিয়েছিল তা হ'ল "ก้้้้้้้้้้้้้้้้้้้้".charCodeAt(2).toString(16)= "ই 49" যা সংশ্লেষণের সীমার মধ্যে নয়, এটি 'ব্যক্তিগত ব্যবহারে' পড়ে।

সি # এ তারা নীচে পড়ে UnicodeCategory.NonSpacingMarkএবং নিম্নলিখিত স্ক্রিপ্টগুলি এড়িয়ে যায়:

    [Test]
    public void IsZalgo()
    {
        var zalgo = new[] { UnicodeCategory.NonSpacingMark };

        File.Delete("IsModifyLike.html");
        File.AppendAllText("IsModifyLike.html", "<table>");
        for (var i = 0; i < 65535; i++)
        {
            var c = (char)i;
            if (zalgo.Contains(Char.GetUnicodeCategory(c)))
            {


                File.AppendAllText("IsModifyLike.html", string.Format("<tr><td>{0}</td><td>{1}</td><td>{2}</td><td>A&#{3};&#{3};&#{3}</td></tr>\n",  i.ToString("X"), c, Char.GetUnicodeCategory(c), i));

            }
        }
        File.AppendAllText("IsModifyLike.html", "</table>");
    }

উত্পন্ন টেবিলটি দেখে আপনি দেখতে পাবেন যে কোনটি স্ট্যাক করে। উইকিতে অনুপস্থিত একটি পরিসীমা হ'ল 06D6-06DCঅন্যটি 0730-0749

হালনাগাদ:

এখানে আপডেট হওয়া রেজেক্স যা 'স্বাভাবিক' ব্যাপ্তিতে বাইপাসিত জেলাগুলি সহ সমস্ত জালগো খুঁজে বের করতে পারে।

([\u0300–\u036F\u1AB0–\u1AFF\u1DC0–\u1DFF\u20D0–\u20FF\uFE20–\uFE2F\u0483-\u0486\u05C7\u0610-\u061A\u0656-\u065F\u0670\u06D6-\u06ED\u0711\u0730-\u073F\u0743-\u074A\u0F18-\u0F19\u0F35\u0F37\u0F72-\u0F73\u0F7A-\u0F81\u0F84\u0e00-\u0eff\uFC5E-\uFC62]{2,})

সবচেয়ে শক্ত বিট হ'ল তাদের শনাক্ত করা, একবার আপনি এটি শেষ করে নিলে - উপরের কয়েকটি ভালগুলি সহ প্রচুর সমাধান রয়েছে।

আশা করি এটি আপনার কিছুটা সময় সাশ্রয় করবে।


আমি বলব, এই স্প্যাম স্প্যাম না!
প্রবীণ কুমার পুরুষোথমণ

@ প্রবীণকুমার আপনি কী বোঝাতে চাইছেন তা কি বিস্তারিত জানাতে আগ্রহী?
মাতাস ভাইটকেভিচিয়াস

আমি আপনার উত্তর প্রশংসা করি, কিন্তু এটি একটি হারিয়ে উত্তর উত্তর। তাহলে কেন অযথা নতুন উত্তর যুক্ত করবেন? এটা আমার দৃষ্টিভঙ্গি মাত্র। তদুপরি, আপনার উত্তরটি জাভাস্ক্রিপ্ট নয়, তাই না?
প্রবীণ কুমার পুরুষোথমণ

4
@ প্রবীণকুমার এটি জানায় যে সাধারণ জালগো বৈধতা কেন ([\u0300–\u036F\u1AB0–\u1AFF\u1DC0–\u1DFF\u20D0–\u20FF\uFE20–\uFE2F]{2,})কাজ করে না। আপনি কি আকর্ষণীয় মনে করেন যে ইউনিকোড স্ট্যাকিং উইকির উপর সীমাবদ্ধ নয়? 'হারানো উত্তরের প্রশ্ন' বলতে কী বোঝ? সম্পাদনা : আপনার কাছে 3 বছরের পুরানো প্রশ্নের উত্তর যোগ করা অদ্ভুত বলে মনে হতে পারে, তবে যেহেতু এই ধরণের জালগো কাজ করেছিল তা বুঝতে আমার একটু সময় লেগেছে কারণ আমি এই ধরণের জ্ঞানকে নষ্ট করতে দিতে পারি না। পরের লোকটি কিছুটা সময় সাশ্রয় করবে।
মাতাস ভাইটকিভিসিয়াস

7
@ প্রবীণকুমার প্রশ্নটি কোন ভাষা বলে না, এবং যদি কোনও উপায়ে পুরানো উত্তরগুলির ঘাটতি থাকে তবে কোনও পুরানো প্রশ্নের উপর নতুন উত্তর পোস্ট করা পুরোপুরি উপযুক্ত। দুর্ভাগ্যক্রমে আমার এই সমস্যাটির সাথে পর্যাপ্ত অভিজ্ঞতা নেই, অথবা এটি আমার কাছ থেকে উত্সাহ পেতে পারে।
মার্ক রান্সম
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.