ลบ✅, 🔥, ✈, ♛และอื่น ๆ เช่น emojis / images / signs จากสตริง Java


192

ฉันมีสายอักขระที่มีอิโมจิ / ภาพ / สัญลักษณ์ต่าง ๆ ทุกชนิด

ไม่ใช่ทุกสายอักขระที่เป็นภาษาอังกฤษ - บางส่วนเป็นภาษาอื่นที่ไม่ใช่ภาษาละตินตัวอย่างเช่น:

▓ railway??
→ Cats and dogs
I'm on 🔥
Apples ⚛ 
✅ Vi sign
♛ I'm the king ♛ 
Corée ♦ du Nord ☁  (French)
 gjør at både ◄╗ (Norwegian)
Star me ★
Star ⭐ once more
早上好 ♛ (Chinese)
Καλημέρα ✂ (Greek)
another ✓ sign ✓
добрай раніцы ✪ (Belarus)
◄ शुभ प्रभात ◄ (Hindi)
✪ ✰ ❈ ❧ Let's get together ★. We shall meet at 12/10/2018 10:00 AM at Tony's.❉

... และอีกมากมาย

ฉันต้องการกำจัดเครื่องหมาย / ภาพเหล่านี้ทั้งหมดและเก็บเฉพาะตัวอักษร (และเครื่องหมายวรรคตอน) ในภาษาต่างๆ

ฉันพยายามทำความสะอาดป้ายโดยใช้ห้องสมุด EmojiParser :

String withoutEmojis = EmojiParser.removeAllEmojis(input);

ปัญหาคือ EmojiParser ไม่สามารถลบสัญญาณส่วนใหญ่ได้ เครื่องหมาย♦เป็นสิ่งเดียวที่ฉันค้นพบมาจนถึงตอนนี้มันถูกลบออก สัญญาณอื่น ๆ เช่น✪❉★✰❈❧✂❋❋ⓡ✿🔥🔥จะไม่ถูกลบ

มีวิธีลบสัญญาณเหล่านี้ทั้งหมดจากสายป้อนข้อมูลและเก็บเฉพาะตัวอักษรและเครื่องหมายวรรคตอนในภาษาต่าง ๆหรือไม่


91
คุณต้องการเก็บอะไร
— YCF_L

31
ปัญหาสองประการคือ EmojiParser คืออะไร ดูเหมือนจะไม่ได้เป็นส่วนหนึ่งของไลบรารีมาตรฐานดังนั้นการกล่าวถึงนี้จึงไม่ค่อยมีประโยชน์ และคุณต้องการกรองตัวละครแบบใดกันแน่? คุณพูดว่า "มากกว่านี้อีก" แต่มีกลุ่มตัวละครและครอบครัวมากมาย เราจำเป็นต้องรู้เพิ่มเติมเกี่ยวกับเกณฑ์ของคุณ
— Markus Fischer

129
IDK แรงบันดาลใจของคุณที่อยู่เบื้องหลังสิ่งนี้คืออะไร แต่ถ้ามันกรองการป้อนข้อความเกินไป: ไม่ ฉันเบื่อที่จะถูกบังคับให้ใช้ a-zA-Z ให้ฉันเขียนเป็นภาษาพื้นเมืองหรืออิโมจิหรือสิ่งที่ฉันต้องการ ฉันต้องการให้ฉันตั้งชื่อปฏิทินว่า "🤦🏻‍♂️" จริงหรือไม่? ใช่ฉันทำ ออกไปจากทางของฉันแล้ว
— Alexander - Reinstate Monica

19
โปรดอธิบายสิ่งที่คุณต้องการเก็บและลบ บนพื้นผิวคำถามดูเหมือนจะชัดเจน แต่เนื่องจากความซับซ้อนของ Unicode นั้นไม่ได้และเนื่องจากเป็นไปไม่ได้ที่จะให้คำตอบที่ดี
— Oleg

12
ดูเหมือนจะเป็นเรื่องแปลกที่อยากทำเมื่อทำลายความหมายของตัวอย่างของคุณอย่างน้อยหนึ่งรายการ
— Eevee

คำตอบ:


290

แทนที่จะขึ้นบัญชีดำองค์ประกอบบางอย่างวิธีสร้างรายการที่อนุญาตของอักขระที่คุณต้องการเก็บไว้ วิธีนี้คุณไม่ต้องกังวลกับการเพิ่มอีโมจิใหม่ทุกอัน

String characterFilter = "[^\\p{L}\\p{M}\\p{N}\\p{P}\\p{Z}\\p{Cf}\\p{Cs}\\s]";
String emotionless = aString.replaceAll(characterFilter,"");

ดังนั้น:

  • [\\p{L}\\p{M}\\p{N}\\p{P}\\p{Z}\\p{Cf}\\p{Cs}\\s]เป็นช่วงที่เป็นตัวแทนของตัวเลข ( \\p{N}), ตัวอักษร ( \\p{L}), เครื่องหมาย ( \\p{M}), เครื่องหมายวรรคตอน ( \\p{P}), ช่องว่าง / ตัวคั่น ( \\p{Z}), การจัดรูปแบบอื่น ( \\p{Cf}) และอักขระอื่น ๆ ด้านบนU+FFFFในอักขระ Unicode ( \\p{Cs}) และ newline ( \\s) \\p{L}เฉพาะรวมถึงตัวละครจากตัวอักษรอื่น ๆ เช่นริลลิก, ละติน, จิ ฯลฯ
  • ^ในชุดอักขระ regex ขัดแย้งการแข่งขัน

ตัวอย่าง:

String str = "hello world _# 皆さん、こんにちは! 私はジョンと申します。🔥";
System.out.print(str.replaceAll("[^\\p{L}\\p{M}\\p{N}\\p{P}\\p{Z}\\p{Cf}\\p{Cs}\\s]",""));
// Output:
//   "hello world _# 皆さん、こんにちは! 私はジョンと申します。"

หากคุณต้องการข้อมูลเพิ่มเติมตรวจสอบเอกสาร Java สำหรับ regexes


4
ช่องว่างที่ชัดเจนระหว่างตัวอักษรและตัวเลข ASCII และ emoji เน้นเสียงและตัวอักษรที่ไม่ใช่ละติน หากไม่มีการป้อนข้อมูลของ OP เกี่ยวกับสิ่งเหล่านี้เราไม่ทราบว่านี่เป็นคำตอบที่ดี (ไม่ใช่ DV ของฉัน)
— Chris H

4
ใช่ฉันอยากรู้ว่าทำไมสิ่งนี้อาจจะถูกลดระดับลง ครั้งที่สองที่ฉันเห็นคำถามนี้การแสดงออกปกติเป็นสิ่งแรกที่นึกถึง (PS เนื่องจากเขากำลังมองหาตัวละครมาตรฐานและเครื่องหมายวรรคตอนฉันจะใช้สิ่งที่ชอบ[^\w\^\-\[\]\.!@#$%&*\(\)/+'":;~?,]แต่นั่นเป็นเพียงฉันที่แข็งแกร่งและพยายามรวบรวมตัวละครทั่วไปทั้งหมดที่ไม่ได้ สัญลักษณ์) เพิ่มขึ้นเพราะนี่เป็นทางออกที่มีศักยภาพ หากเขาต้องการเพิ่มอักขระภาษาอื่นเขาสามารถเพิ่มพวกเขาลงในนิพจน์ตามความจำเป็น
— Chris

15
@Chris ตัวอย่าง regex เครื่องหมายวรรคตอนที่ดีดูกว้างขวางพอสำหรับบางกรณี นอกจากนี้ยังอาจจะมีคนที่ไม่ได้อ่านคำตอบทั้งหมดแล้ว - ตามที่ระบุไว้ที่ด้านล่างของคำตอบที่p{L}จะจัดการกับตัวละครที่ไม่ใช่ภาษาอังกฤษตัวอักษร ฉันหวังว่าจะเข้าใจว่าฉันไม่สามารถเขียนรายการอย่างกว้างขวางผ่านตัวอักษรที่ไม่ใช่ภาษาอังกฤษทุกคำตอบได้
— Nick Bull

12
นี้. กรุณาและขอบคุณ อย่าพยายามห้ามตัวละครที่ทำให้เกิดปัญหา ตัดสินใจเลือกตัวละครที่คุณอนุญาตและเข้ารหัส จากนั้นโค้ดของคุณจะมีชุดทดสอบที่กำหนดไว้อย่างชัดเจน
— jpmc26

2
"[^\\p{L}\\p{M}\\p{N}\\p{P}\\p{Z}\\p{Cf}\\s]"ผมขอแนะนำให้ สิ่งนี้อนุญาตให้หมวดหมู่ทั่วไปจดหมายเครื่องหมายหมายเลขเครื่องหมายวรรคตอนตัวแยกและ "อื่น ๆ รูปแบบ" รวมถึงอักขระช่องว่างเช่นแท็บและขึ้นบรรทัดใหม่
— Sean Van Gorder

81

ฉันไม่ใช่ super ใน Java ดังนั้นฉันจะไม่พยายามเขียนโค้ดตัวอย่างแบบอินไลน์ แต่วิธีที่ฉันจะทำคือตรวจสอบสิ่งที่ Unicode เรียกว่า "หมวดหมู่ทั่วไป" ของตัวละครแต่ละตัว มีตัวอักษรคู่และเครื่องหมายวรรคตอน

คุณสามารถใช้Character.getTypeเพื่อค้นหาหมวดหมู่ทั่วไปของตัวละครที่กำหนด คุณน่าจะเก็บตัวละครเหล่านั้นไว้ในหมวดหมู่ทั่วไปเหล่านี้

COMBINING_SPACING_MARK
CONNECTOR_PUNCTUATION
CURRENCY_SYMBOL
DASH_PUNCTUATION
DECIMAL_DIGIT_NUMBER
ENCLOSING_MARK
END_PUNCTUATION
FINAL_QUOTE_PUNCTUATION
FORMAT
INITIAL_QUOTE_PUNCTUATION
LETTER_NUMBER
LINE_SEPARATOR
LOWERCASE_LETTER
MATH_SYMBOL
MODIFIER_LETTER
MODIFIER_SYMBOL
NON_SPACING_MARK
OTHER_LETTER
OTHER_NUMBER
OTHER_PUNCTUATION
PARAGRAPH_SEPARATOR
SPACE_SEPARATOR
START_PUNCTUATION
TITLECASE_LETTER
UPPERCASE_LETTER

(ตัวละครทั้งหมดที่คุณระบุว่าต้องการลบโดยเฉพาะมีหมวดหมู่ทั่วไปOTHER_SYMBOLซึ่งฉันไม่ได้รวมไว้ในรายการที่อนุญาตในหมวดหมู่ด้านบน)


1
รูปแบบ (Cf) ควรได้รับการเก็บรักษาไว้ด้วย; ซึ่งรวมถึงการจัดกลุ่มและการแทนที่ทิศทางโดยที่ไม่สามารถเขียนคำบางคำที่ผิดปกติ (ผิดปกติยอมรับได้) ในบางภาษา
— zwol

@zwol ขอบคุณสำหรับรายละเอียด! ฉันจะเพิ่มลงในรายการ
— Daniel Wagner

29
นี่คือคำตอบที่พิสูจน์ได้ในอนาคต ไม่ว่าการอัปเดตมาตรฐาน Unicode ในอนาคตจะเป็นอย่างไรรวมถึง / ไม่รวมอักขระตามหมวดหมู่หมายความว่าการแยกวิเคราะห์อักขระและการบำรุงรักษารายการไม่จำเป็น แน่นอนว่าการทดสอบแบบคร่าวๆของข้อความในภาษาต่าง ๆ (เช่นภาษาจีนภาษาอาหรับ ฯลฯ ) ควรทำเพื่อให้แน่ใจว่าหมวดหมู่ที่กรองแล้วตรงกับข้อความที่จำเป็นต้องได้รับอนุญาตในสภาพแวดล้อมเป้าหมาย
— CJBS

3
โอ้ gotcha อีกอันที่ฉันควรนึกเมื่อวานนี้: TAB, CR และ LF เป็นหมวดหมู่ทั่วไป Cc (การควบคุมของ Java) สิ่งเหล่านั้นจำเป็นต้องได้รับการยกเว้นพิเศษเนื่องจากคุณเกือบจะไม่ต้องการอนุญาตให้ใช้อักขระควบคุมแบบดั้งเดิมส่วนใหญ่
— zwol

@CJBS ปัญหาเกี่ยวกับวิธีการนี้คือมีการนำไปใช้บางส่วนใน Java เท่านั้น ตัวอย่างเช่นCharacter.getType()จะไม่บอกคุณว่าchar(หรือintจุดรหัสเนื่องจากวิธีการโหลดมากเกินไป) คือการพูดอิโมติคอนหรือสัญลักษณ์ดนตรีหรือตัวละครอิโมจิ ฯลฯ หากคุณมีกรณีการใช้งานง่ายมันอาจจะดี เพื่อลงไปสู่เส้นทางนี้ - มันเป็นวิธีการที่สวยงามที่เข้าใจได้ง่าย - แต่ระวังว่ามันอาจแตกถ้าความต้องการเปลี่ยนแปลง
— skomisa

47

จากรายการ Emoji แบบเต็ม v11.0คุณมีคะแนนโค้ด Unicode ที่แตกต่างกันถึง 1,644 จุด ยกตัวอย่างเช่นอยู่ในรายการนี้เป็น✅U+2705

มีรายการเต็มรูปแบบของอีโมจิที่คุณจำเป็นต้องกรองออกโดยใช้จุดรหัส การวนซ้ำมากกว่าหนึ่งครั้งcharหรือbyteไม่ทำงานเพราะจุดรหัสเดียวสามารถขยายได้หลายไบต์ เพราะ Java ใช้ UTF-16 อิโมจิมักจะใช้เวลาสองcharวินาที

String input = "ab✅cd";
for (int i = 0; i < input.length();) {
  int cp = input.codePointAt(i);
  // filter out if matches
  i += Character.charCount(cp); 
}

การแม็พจากจุดโค้ด Unicode U+2705ถึง Java intนั้นตรงไปตรงมา:

int viSign = 0x2705;

หรือตั้งแต่ Java รองรับ Unicode Strings:

int viSign = "✅".codePointAt(0);

28
รายการที่มีประโยชน์มาก น่าสนใจว่าบางสิ่งที่เรียกว่า EmojiParser ด้วยวิธีการที่ชื่อว่า removeAllEmojis ล้มเหลวในการจัดการสิ่งเหล่านี้ ... :-)
— TJ Crowder

7
@Bergi: ไม่input.codePointAtเพียงเพราะดูได้สูงสุด 2 ตัวอักษรซึ่งเป็นขอบเขตบนคงที่ นอกจากนี้ (เพิ่มใหม่) i += Character.charCount(cp)ข้ามตัวละครทั้งหมดที่input.codePointAtตรวจสอบ (ลบ 1 ในบางกรณีมุม)
— David Foerster

6
@ OlivierGrégoire: String.chars()สตรีมเหนือตัวอักษรไม่ใช่ codepoints มีวิธีแยกต่างหากString.codePoints()สำหรับสิ่งนั้น
— David Foerster

5
มีปัญหาอย่างน้อยสองปัญหาที่นี่: คุณกำลังใช้รายการ "ปิด" ของอิโมจิดังนั้นในแต่ละปีคุณต้องขยายมัน (แต่นี่อาจจะไม่สามารถแก้ไขได้ง่าย) และรหัสนี้อาจทำงานไม่ถูกต้องกับลำดับของ codepoints (ดูตัวอย่างunicode.org/Public/emoji/11.0/emoji-zwj-sequences.txt )
— xanatos

49
นี่เป็นวิธีการเดียวกับที่ใช้โดย EmojiParser และจะล้มเหลวในไม่ช้าด้วยเหตุผลเดียวกัน อิโมจิใหม่จะถูกเพิ่มไปยังฐานข้อมูลอักขระ Unicode บ่อยครั้งและหากคุณกำลังใช้โซลูชันโดยใช้อีโมจิ 1644 ที่กำหนดไว้ในปัจจุบันสำหรับชุดกฎเชิงลบการดำเนินการจะล้มเหลวทันทีที่อิโมจิใหม่พร้อมใช้งาน
— jarnbjo

20

ICU4J เป็นเพื่อนของคุณ

UCharacter.hasBinaryProperty(UProperty.EMOJI);

โปรดจำไว้ว่าให้เวอร์ชัน icu4j ของคุณทันสมัยอยู่เสมอและโปรดทราบว่านี่จะกรองอิโมจิ Unicode อย่างเป็นทางการเท่านั้นไม่ใช่ตัวอักษรสัญลักษณ์ รวมกับการกรองประเภทอักขระอื่น ๆ ตามที่ต้องการ

ข้อมูลเพิ่มเติม: http://icu-project.org/apiref/icu4j/com/ibm/icu/lang/UProperty.html#EMOJI


1
จนกว่า Java จะได้รับการอัพเดตให้รวมคุณสมบัติเลขฐานสองของ Emoji ด้วยฉันคิดว่านี่จะเป็นทางออกที่ดี แม้ว่าห้องสมุดจะต้องได้รับการปรับปรุงบ่อยครั้งสำหรับ codepoints ที่เพิ่งเพิ่มเข้ามาใหม่
— nhahtdh

10

ฉันยกตัวอย่างด้านล่างและคิดว่าละตินก็เพียงพอแล้ว แต่ ...

มีวิธีลบสัญญาณเหล่านี้ทั้งหมดจากสายป้อนข้อมูลและเก็บเฉพาะตัวอักษร & เครื่องหมายวรรคตอนในภาษาต่าง ๆ หรือไม่

หลังจากแก้ไขแล้วให้พัฒนาโซลูชันใหม่โดยใช้Character.getTypeวิธีการและนั่นเป็นภาพที่ดีที่สุดในตอนนี้

package zmarcos.emoji;

import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;

public class TestEmoji {

    public static void main(String[] args) {
        String[] arr = {"Remove ✅, 🔥, ✈ , ♛ and other such signs from Java string",
            "→ Cats and dogs",
            "I'm on 🔥",
            "Apples ⚛ ",
            "✅ Vi sign",
            "♛ I'm the king ♛ ",
            "Star me ★",
            "Star ⭐ once more",
            "早上好 ♛",
            "Καλημέρα ✂"};
        System.out.println("---only letters and spaces alike---\n");
        for (String input : arr) {
            int[] filtered = input.codePoints().filter((cp) -> Character.isLetter(cp) || Character.isWhitespace(cp)).toArray();
            String result = new String(filtered, 0, filtered.length);
            System.out.println(input);
            System.out.println(result);
        }

        System.out.println("\n---unicode blocks white---\n");
        Set<Character.UnicodeBlock> whiteList = new HashSet<>();
        whiteList.add(Character.UnicodeBlock.BASIC_LATIN);
        for (String input : arr) {
            int[] filtered = input.codePoints().filter((cp) -> whiteList.contains(Character.UnicodeBlock.of(cp))).toArray();
            String result = new String(filtered, 0, filtered.length);
            System.out.println(input);
            System.out.println(result);
        }

        System.out.println("\n---unicode blocks black---\n");
        Set<Character.UnicodeBlock> blackList = new HashSet<>();        
        blackList.add(Character.UnicodeBlock.EMOTICONS);
        blackList.add(Character.UnicodeBlock.MISCELLANEOUS_TECHNICAL);
        blackList.add(Character.UnicodeBlock.MISCELLANEOUS_SYMBOLS);
        blackList.add(Character.UnicodeBlock.MISCELLANEOUS_SYMBOLS_AND_ARROWS);
        blackList.add(Character.UnicodeBlock.MISCELLANEOUS_SYMBOLS_AND_PICTOGRAPHS);
        blackList.add(Character.UnicodeBlock.ALCHEMICAL_SYMBOLS);
        blackList.add(Character.UnicodeBlock.TRANSPORT_AND_MAP_SYMBOLS);
        blackList.add(Character.UnicodeBlock.GEOMETRIC_SHAPES);
        blackList.add(Character.UnicodeBlock.DINGBATS);
        for (String input : arr) {
            int[] filtered = input.codePoints().filter((cp) -> !blackList.contains(Character.UnicodeBlock.of(cp))).toArray();
            String result = new String(filtered, 0, filtered.length);
            System.out.println(input);
            System.out.println(result);
        }
        System.out.println("\n---category---\n");
        int[] category = {Character.COMBINING_SPACING_MARK, Character.COMBINING_SPACING_MARK, Character.CONNECTOR_PUNCTUATION, /*Character.CONTROL,*/ Character.CURRENCY_SYMBOL,
            Character.DASH_PUNCTUATION, Character.DECIMAL_DIGIT_NUMBER, Character.ENCLOSING_MARK, Character.END_PUNCTUATION, Character.FINAL_QUOTE_PUNCTUATION,
            /*Character.FORMAT,*/ Character.INITIAL_QUOTE_PUNCTUATION, Character.LETTER_NUMBER, Character.LINE_SEPARATOR, Character.LOWERCASE_LETTER,
            /*Character.MATH_SYMBOL,*/ Character.MODIFIER_LETTER, /*Character.MODIFIER_SYMBOL,*/ Character.NON_SPACING_MARK, Character.OTHER_LETTER, Character.OTHER_NUMBER,
            Character.OTHER_PUNCTUATION, /*Character.OTHER_SYMBOL,*/ Character.PARAGRAPH_SEPARATOR, /*Character.PRIVATE_USE,*/
            Character.SPACE_SEPARATOR, Character.START_PUNCTUATION, /*Character.SURROGATE,*/ Character.TITLECASE_LETTER, /*Character.UNASSIGNED,*/ Character.UPPERCASE_LETTER};
        Arrays.sort(category);
        for (String input : arr) {
            int[] filtered = input.codePoints().filter((cp) -> Arrays.binarySearch(category, Character.getType(cp)) >= 0).toArray();
            String result = new String(filtered, 0, filtered.length);
            System.out.println(input);
            System.out.println(result);
        }
    }

}

เอาท์พุท:

---only letters and spaces alike---

Remove ✅, 🔥, ✈ , ♛ and other such signs from Java string
Remove      and other such signs from Java string
→ Cats and dogs
 Cats and dogs
I'm on 🔥
Im on 
Apples ⚛ 
Apples  
✅ Vi sign
 Vi sign
♛ I'm the king ♛ 
 Im the king  
Star me ★
Star me 
Star ⭐ once more
Star  once more
早上好 ♛
早上好 
Καλημέρα ✂
Καλημέρα 

---unicode blocks white---

Remove ✅, 🔥, ✈ , ♛ and other such signs from Java string
Remove , ,  ,  and other such signs from Java string
→ Cats and dogs
 Cats and dogs
I'm on 🔥
I'm on 
Apples ⚛ 
Apples  
✅ Vi sign
 Vi sign
♛ I'm the king ♛ 
 I'm the king  
Star me ★
Star me 
Star ⭐ once more
Star  once more
早上好 ♛

Καλημέρα ✂


---unicode blocks black---

Remove ✅, 🔥, ✈ , ♛ and other such signs from Java string
Remove , ,  ,  and other such signs from Java string
→ Cats and dogs
→ Cats and dogs
I'm on 🔥
I'm on 
Apples ⚛ 
Apples  
✅ Vi sign
 Vi sign
♛ I'm the king ♛ 
 I'm the king  
Star me ★
Star me 
Star ⭐ once more
Star  once more
早上好 ♛
早上好 
Καλημέρα ✂
Καλημέρα 

---category---

Remove ✅, 🔥, ✈ , ♛ and other such signs from Java string
Remove , ,  ,  and other such signs from Java string
→ Cats and dogs
 Cats and dogs
I'm on 🔥
I'm on 
Apples ⚛ 
Apples  
✅ Vi sign
 Vi sign
♛ I'm the king ♛ 
 I'm the king  
Star me ★
Star me 
Star ⭐ once more
Star  once more
早上好 ♛
早上好 
Καλημέρα ✂
Καλημέρα 

รหัสทำงานโดยการสตรีม String ไปยังจุดรหัส จากนั้นใช้ lambdas เพื่อกรองอักขระลงในintอาร์เรย์จากนั้นเราแปลงอาร์เรย์เป็น String

ตัวอักษรและช่องว่างที่มีการใช้การใช้วิธีการของตัวละครที่จะกรองไม่ดีกับเครื่องหมายวรรคตอน ความพยายามล้มเหลวพยายามที่ล้มเหลว

Unicode บล็อกสีขาวกรองโดยใช้บล็อก Unicode โปรแกรมเมอร์ระบุว่าได้รับอนุญาตความพยายามล้มเหลวพยายามที่ล้มเหลว

Unicode บล็อกสีดำกรองใช้บล็อก Unicode ระบุโปรแกรมเมอร์ที่จะไม่ได้รับอนุญาตความพยายามล้มเหลวพยายามที่ล้มเหลว

ประเภทการCharacter.getTypeกรองโดยใช้วิธีการแบบคงที่ โปรแกรมเมอร์สามารถกำหนดcategoryประเภทของสิ่งที่ได้รับอนุญาตในอาเรย์ ทำงาน 😨😱😰😲😀


import java.lang.Character.UnicodeBlock;จากนั้น Character.UnicodeBlockUnicodeBlock ->
— แบร์นฮาร์ดบาร์เกอร์

วิธีการทดสอบของคุณล้มเหลว
— Oleg

@ โอเล็กไม่มองอีกครั้ง white listตัวอย่าง
— Marcos Zolnowski

บางสิ่งต้องผิดปกติด้วยตาหรือจอมอนิเตอร์ของฉันฉันไม่สามารถเห็นได้คือ早上好และΚαλημέρα
— Oleg

4
โปรดทราบว่าภาษา Java ช้าลงเล็กน้อยที่สนับสนุน Unicode รุ่นใหม่กว่า ... ตัวอย่างเช่น Java 10 รองรับเฉพาะ Unicode 8 (ดังนั้นคลาสของอักขระจะอธิบายเฉพาะอักขระ Unicode 8 เท่านั้น) ... อีโมจิจำนวนมากจึงไม่ปรากฏ (ดูdocs.oracle .com / javase / 10 / เอกสาร / API / java / lang / Character.html , ข้อมูลตัวละครที่อยู่บนพื้นฐานของมาตรฐาน Unicode, รุ่น 8.0.0. )
— Xanatos


-2

ใช้ปลั๊กอิน jQuery ที่เรียกว่า RM-Emoji นี่คือวิธีการทำงาน:

$('#text').remove('emoji').fast()

นี่คือโหมดเร็วที่อาจพลาดอิโมจิบางอย่างเนื่องจากใช้อัลกอริธึมแบบแก้ปัญหาในการค้นหาอีโมจิในข้อความ ใช้.full()วิธีการสแกนสตริงทั้งหมดและลบอิโมจิทั้งหมดที่รับประกัน


5
คำถามคือใน Java ดังนั้นปลั๊กอิน jQuery ไม่เกี่ยวข้องที่นี่
— ริโอริโอ
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.