ওপ ডি সির্কেল বেশিরভাগ ক্ষেত্রেই সঠিক। তাঁর পরামর্শ বেশিরভাগ ক্ষেত্রে কার্যকর হবে:
myString.replaceAll("\\p{C}", "?");
তবে যদি myStringবিএমপিবিহীন কোডপয়েন্ট থাকতে পারে তবে এটি আরও জটিল। \p{C}এর সারোগেট কোডপয়েন্ট রয়েছে \p{Cs}। উপরের প্রতিস্থাপনের পদ্ধতিটি কখনও কখনও সার্গেট জুটির অর্ধেকটি প্রতিস্থাপন করে নন-বিএমপি কোডপয়েন্টগুলিকে দূষিত করে দেয়। এটি ইচ্ছাকৃত আচরণের চেয়ে জাভা বাগ is
অন্যান্য উপাদান বিভাগগুলি ব্যবহার করা একটি বিকল্প:
myString.replaceAll("[\\p{Cc}\\p{Cf}\\p{Co}\\p{Cn}]", "?");
যাইহোক, একা সারোগেট অক্ষরগুলি কোনও জোড়ের অংশ নয় (প্রতিটি সারোগেট চরিত্রের একটি নির্ধারিত কোডপয়েন্ট রয়েছে) সরানো হবে না। সঠিকভাবে পরিচালনা করার জন্য আমি জানি কেবলমাত্র একটি রেজিেক্স পদ্ধতির \p{C}:
StringBuilder newString = new StringBuilder(myString.length());
for (int offset = 0; offset < myString.length();)
{
int codePoint = myString.codePointAt(offset);
offset += Character.charCount(codePoint);
switch (Character.getType(codePoint))
{
case Character.CONTROL:
case Character.FORMAT:
case Character.PRIVATE_USE:
case Character.SURROGATE:
case Character.UNASSIGNED:
newString.append('?');
break;
default:
newString.append(Character.toChars(codePoint));
break;
}
}