ลบ✅, 🔥, ✈, ♛และอื่น ๆ เช่น 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.