কোনও স্ট্রিংয়ে কেবল এএসসিআইআই রয়েছে কিনা তা কীভাবে পরীক্ষা করবেন?


120

চরিত্রটি যদি একটি চিঠি থাকে তবে কলটি Character.isLetter(c)ফিরে আসে true। তবে কী কী দ্রুত Stringএএসসিআইআইয়ের বেস অক্ষরগুলি অন্তর্ভুক্ত রয়েছে তা খুঁজে পাওয়ার কোনও উপায় আছে ?

উত্তর:


128

19.0 এর পর থেকে পেয়ারা আপনি ব্যবহার করতে পারেন:

boolean isAscii = CharMatcher.ascii().matchesAllOf(someString);

এটি সেই matchesAllOf(someString)পদ্ধতিটি ব্যবহার করে যা ascii()এখন অবহেলিত ASCIIসিঙ্গলটনের পরিবর্তে কারখানার পদ্ধতির উপর নির্ভর করে ।

এখানে হওয়া ASCII সব ASCII অক্ষর অন্তর্ভুক্ত সহ মুদ্রণযোগ্য নয় এমন অক্ষরের চেয়ে কম 0x20(স্থান) যেমন ট্যাব, লাইন-ফিড / রিটার্ন যেমন বরং BELকোড সহ 0x07এবং DELকোড দিয়ে 0x7F

পূর্ববর্তী সংস্করণগুলির মন্তব্যে কোড পয়েন্টগুলি নির্দেশিত থাকলেও এই কোডটি কোড পয়েন্টের পরিবর্তে ভুলভাবে অক্ষর ব্যবহার করে। ভাগ্যক্রমে, এর U+010000চেয়ে বেশি মূল্যের সাথে কোড পয়েন্ট তৈরি করতে প্রয়োজনীয় অক্ষরগুলি ASCII সীমার বাইরে মান সহ দুটি সরোগেট অক্ষর ব্যবহার করে। সুতরাং পদ্ধতিটি এখনও ASCII, এমনকি ইমোজিযুক্ত স্ট্রিংগুলির জন্য পরীক্ষায় সফল হয়।

ascii()পদ্ধতিটি ছাড়াই পূর্বের পেয়ারা সংস্করণগুলির জন্য আপনি লিখতে পারেন:

boolean isAscii = CharMatcher.ASCII.matchesAllOf(someString);

31
+1 যদিও আপনার অন্য তৃতীয় পক্ষের লাইব্রেরির প্রয়োজন না থাকলে এটি বেশ ভাল, কলিনের উত্তর অনেক খাটো এবং আরও অনেক বেশি পাঠযোগ্য। তৃতীয় পক্ষের লাইব্রেরিগুলির পরামর্শ দেওয়া পুরোপুরি ঠিক আছে এবং নেতিবাচক ভোট দিয়ে শাস্তি দেওয়া উচিত নয়।
জেস্পার

1
আমার এও উল্লেখ করা উচিত যে CharMatchers সত্যিই অবিশ্বাস্যরকম শক্তিশালী এবং এর চেয়ে আরও waaaay করতে পারে। এএসসিআইআই ছাড়াও আরও অনেক পূর্বনির্ধারিত চারম্যাচার এবং কাস্টমগুলি তৈরির দুর্দান্ত কারখানা পদ্ধতি রয়েছে।
কলিনড

7
CharMatcher.ASCIIএখন
অবহেলিত

108

আপনি এটি java.nio.charset.Charset দিয়ে করতে পারেন ।

import java.nio.charset.Charset;

public class StringUtils {

  public static boolean isPureAscii(String v) {
    return Charset.forName("US-ASCII").newEncoder().canEncode(v);
    // or "ISO-8859-1" for ISO Latin 1
    // or StandardCharsets.US_ASCII with JDK1.7+
  }

  public static void main (String args[])
    throws Exception {

     String test = "Réal";
     System.out.println(test + " isPureAscii() : " + StringUtils.isPureAscii(test));
     test = "Real";
     System.out.println(test + " isPureAscii() : " + StringUtils.isPureAscii(test));

     /*
      * output :
      *   Réal isPureAscii() : false
      *   Real isPureAscii() : true
      */
  }
}

একটি স্ট্রিং-এ নন-এসএসআইআই অক্ষর সনাক্ত করুন


10
আমি মনে করি না চারসেটইনকডারকে স্থিতিশীল করা ভাল ধারণা যেহেতু ডক্স অনুসারে "এই শ্রেণীর উদাহরণগুলি একাধিক সমবর্তী থ্রেড দ্বারা ব্যবহারের জন্য নিরাপদ নয়।"
pm_labs

@ পল_সনস, আপনি ঠিক বলেছেন চরসেট এনকোডার থ্রেড-নিরাপদ নয় (তবে চরসেটটি তাই) এটি স্থির করা ভাল ধারণা নয়।
রিয়েলহটোতো

11
জাভা ১.7 বা তার চেয়েও বেশি এর StandardCharsets.US_ASCIIপরিবর্তে ব্যবহার করতে পারবেন Charset.forName("US-ASCII")
জুলিয়ান লেটনার

@ রিয়েলহাতো সঠিক সমাধানগুলিতে মন্তব্যগুলির উপর নির্ভর করা উচিত নয়, এই সমস্যাটি সমাধান করার জন্য যত্ন নেওয়া এবং সম্ভবত ভিত্তিক কোনও অনলাইনার পদ্ধতি ব্যবহার করা উচিত StandardCharsets? আমি অন্য উত্তর পোস্ট করতে পারে তবে আমি বরং এটি অত্যন্ত প্রশংসিত উত্তর ঠিক করতে চাই
মার্টেন বোদেউয়েস

77

এখানে একটি অন্য উপায় যা লাইব্রেরির উপর নির্ভর করে নয় তবে একটি রেজেেক্স ব্যবহার করছে।

আপনি এই একক লাইনটি ব্যবহার করতে পারেন:

text.matches("\\A\\p{ASCII}*\\z")

পুরো উদাহরণ প্রোগ্রাম:

public class Main {
    public static void main(String[] args) {
        char nonAscii = 0x00FF;
        String asciiText = "Hello";
        String nonAsciiText = "Buy: " + nonAscii;
        System.out.println(asciiText.matches("\\A\\p{ASCII}*\\z"));
        System.out.println(nonAsciiText.matches("\\A\\p{ASCII}*\\z"));
    }
}

15
\\ এ - ইনপুটটির সূচনা ... \\ p {ASCII} * - যে কোনও সময় কোনও ASCII চরিত্র ... \\ z - ইনপুট সমাপ্তি
আর্নে ডয়েশ

@ আর্নেডিউচ আমি যদি উত্তরটি উন্নত করি এবং উল্লেখ \P{Print}এবং \P{Graph}+ একটি বর্ণনাকে অন্তর্ভুক্ত করি তবে আপনি কি আপত্তি করেন ? আপনার দরকার কেন \Aএবং \z?
মার্টেন বোদেউয়েস

সেই রেজেক্স কী? আমি জানি যে $ স্ট্রিংয়ের শেষ, ^ শুরু, কখনও \\ এ \\ পি \\ জেড এর কোনওরকমই শোনা যায় না, আপনি দয়া করে জাভাদোকের রেফারেন্সটি সংযুক্ত করতে পারবেন?
deathangel908

@ deathangel908 \ A ইনপুট শুরু। \ z ইনপুট এর শেষ। TI এবং UL মাল্টলাইন মোডে আলাদাভাবে আচরণ করে এবং DOTALL L A এবং \ z এর আচরণ পরিবর্তন করে। স্ট্যাকওভারফ্লো.com
নাসিফ

58

স্ট্রিংয়ের মাধ্যমে পরিদর্শন করুন এবং নিশ্চিত করুন যে সমস্ত অক্ষরের 128 এরও কম মান রয়েছে।

জাভা স্ট্রিংগুলি ইউটিএফ -16 হিসাবে ধারণামূলকভাবে এনকোড করা হয়েছে। ইউটিএফ -16 এ, ASCII অক্ষর সেট মান 0 - 127 হিসাবে এনকোড করা হয়েছে এবং কোনও নন ASCII অক্ষরের জন্য এনকোডিং (যা একাধিক জাভা চর নিয়ে গঠিত হতে পারে) 0 - 127 নম্বর অন্তর্ভুক্ত না করার গ্যারান্টিযুক্ত


27
জাভা 1.8 এর সাহায্যে আপনি এটি করতে পারেন:str.chars().allMatch(c -> c < 128)
জুলিয়ান লেটনার

7
আপনি মুদ্রণযোগ্য আপনি যে অক্ষরগুলি জন্য পরীক্ষা করতে পারেন চান c >= 0x20 && c < 0x7Fহিসাবে 7 বিট এনকোডিং প্রথম 32 মান নিয়ন্ত্রণ অক্ষর এবং চূড়ান্ত মান (0x7F) হয় DEL
মার্টেন বোদেউয়েস

15

অথবা আপনি আইডিএন ক্লাস থেকে কোডটি অনুলিপি করুন ।

// to check if a string only contains US-ASCII code point
//
private static boolean isAllASCII(String input) {
    boolean isASCII = true;
    for (int i = 0; i < input.length(); i++) {
        int c = input.charAt(i);
        if (c > 0x7F) {
            isASCII = false;
            break;
        }
    }
    return isASCII;
}

1
এমনকি 2-গৃহস্থালির কাজ-ইউনিকোড সাথে কাজ করে কারণ 1 ম-অক্ষর> = U + এ D800 হয়
k3b

তবে মনে রাখবেন যে এটিতে ASCII- এ প্রিন্টযোগ্য অক্ষর অন্তর্ভুক্ত রয়েছে (যা সঠিক, তবে এটি প্রত্যাশিত নয়)। এটি সরাসরি ব্যবহার করতে অবশ্যই সম্ভব হয় return falseপরিবর্তে ব্যবহার করার isASCII = falseএবং break
মার্টেন বোদেউয়েস

এটি ওরাকল জেডিকে-র কোড। অনুলিপি আইনি সমস্যা হতে পারে।
আর্ন ডয়েশ

11

অ্যাপাচি থেকে কমন্স-ল্যাং 3 এ সমস্ত ধরণের 'সমস্যার' জন্য মূল্যবান ইউটিলিটি / সুবিধার পদ্ধতি রয়েছে one

System.out.println(StringUtils.isAsciiPrintable("!@£$%^&!@£$%^"));

1
সচেতন থাকুন যে ইসি প্রিন্টেবল মিথ্যা প্রত্যাবর্তন করে যদি স্ট্রিংটিতে ট্যাব বা লাইন ফিড অক্ষর থাকে (\ t \ r \ n)।
ট্যাম্পহাজে

@ টম্পা হ্যাজে কারণ এটি অভ্যন্তরীণভাবে প্রতিটি চরিত্রের মান 32 থেকে 127 এর মধ্যে যাচাই করার চেষ্টা করে। আমি মনে করি এটি ভুল। আমরা 0 থেকে 127 পরীক্ষা করা উচিত
therealprashant

1
@ উপস্থিতিপ্রশান্ত যদি পদ্ধতিটির নাম আসকি থাকে তবে আমি আপনার সাথে একমত হব। তবে নামটির নামকরণ করা হচ্ছে অসিয় মুদ্রণযোগ্যটি ইঙ্গিত দেয় যে তারা উদ্দেশ্যমূলকভাবে 0 থেকে 31 অক্ষর বাদ দিয়েছে
টম্পা হ্যাজে

4

এটা চেষ্টা কর:

for (char c: string.toCharArray()){
  if (((int)c)>127){
    return false;
  } 
}
return true;

"এটি চেষ্টা করুন" সর্বদা একটি ডাউনভোট পায়। এ কি করে কি করতে ? কী অন্তর্ভুক্ত এবং কি না? একটি ডাউনভোট পাবেন কারণ আপনি মেমরির দ্বিগুণও আকারে, যাইহোক।
মার্টেন বোদেউয়েস

1

স্ট্রিংটি দিয়ে ইটারেট করুন এবং চরটি পেতে CharAt () ব্যবহার করুন। তারপরে এটি একটি আন্ত হিসাবে বিবেচনা করুন এবং দেখুন এটির কোনও ইউনিকোড মান (ASCII এর একটি সুপারসেট) রয়েছে কিনা তা দেখুন।

আপনি পছন্দ না প্রথম বিরতি।


1
private static boolean isASCII(String s) 
{
    for (int i = 0; i < s.length(); i++) 
        if (s.charAt(i) > 127) 
            return false;
    return true;
}

কোডটি কেবলমাত্র উত্তর দেয়, দয়া করে এটি কী করে তা নির্দেশ করুন, অর্থাত্ যদি আপনি এই চেকটি সম্পাদন করেন তবে এতে প্রিন্টযোগ্য অক্ষর এবং একটি অপরিজ্ঞাত অক্ষর (0x7F) অন্তর্ভুক্ত রয়েছে।
মার্টেন বোদেউয়েস

আমার দীর্ঘ-চলমান প্রোগ্রামটি আগ্রহের কোনও অক্ষর খুঁজে পেতে ব্যর্থ হওয়ার পরে এটি হয়ত আমাকে বিট করতে পারে। charAtফেরত a char। কোনও প্রকার charপ্রথমে কোন ইনট, রূপান্তরিত না করে কোনও প্রকারের চেয়ে বড় হলে আপনি সরাসরি পরীক্ষা করতে পারেন বা আপনার পরীক্ষাটি স্বয়ংক্রিয়ভাবে কভারসিয়েনটি করে? হতে পারে আপনি এবং সম্ভবত এটি পারে? আমি এগিয়ে যান এবং তাই মত কোন int- এ এই রূপান্তরিত: if ((int)s.charAt(i) > 127)। আমার ফলাফলগুলি কিছু আলাদা কিনা তা নিশ্চিত নই তবে এটিকে চালিয়ে দেওয়া সম্পর্কে আমি ভাল বোধ করি। আমরা দেখতে পাব: - \
হার্পারভিল

0

এটা সম্ভব ছিল। খুব সমস্যা।

import java.io.UnsupportedEncodingException;
import java.nio.charset.Charset;
import java.nio.charset.CharsetEncoder;

public class EncodingTest {

    static CharsetEncoder asciiEncoder = Charset.forName("US-ASCII")
            .newEncoder();

    public static void main(String[] args) {

        String testStr = "¤EÀsÆW°ê»Ú®i¶T¤¤¤ß3¼Ó®i¶TÆU2~~KITEC 3/F Rotunda 2";
        String[] strArr = testStr.split("~~", 2);
        int count = 0;
        boolean encodeFlag = false;

        do {
            encodeFlag = asciiEncoderTest(strArr[count]);
            System.out.println(encodeFlag);
            count++;
        } while (count < strArr.length);
    }

    public static boolean asciiEncoderTest(String test) {
        boolean encodeFlag = false;
        try {
            encodeFlag = asciiEncoder.canEncode(new String(test
                    .getBytes("ISO8859_1"), "BIG5"));
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
        return encodeFlag;
    }
}

0

স্ট্রিংয়ের মধ্যে কেবলমাত্র ASCII অক্ষর রয়েছে এবং এটি না থাকলে এটি সত্য হবে

Charset.forName("US-ASCII").newEncoder().canEncode(str)

আপনি যদি এএসসিআইআই ছাড়াই অপসারণ করতে চান তবে স্নিপেটটি এখানে:

if(!Charset.forName("US-ASCII").newEncoder().canEncode(str)) {
                        str = str.replaceAll("[^\\p{ASCII}]", "");
                    }

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