คุณจะตัดอักขระที่ไม่ใช่ ASCII ออกจากสตริงได้อย่างไร (ใน C #)
คุณจะตัดอักขระที่ไม่ใช่ ASCII ออกจากสตริงได้อย่างไร (ใน C #)
คำตอบ:
string s = "søme string";
s = Regex.Replace(s, @"[^\u0000-\u007F]+", string.Empty);
นี่คือโซลูชัน. NET บริสุทธิ์ที่ไม่ใช้นิพจน์ทั่วไป
string inputString = "Räksmörgås";
string asAscii = Encoding.ASCII.GetString(
Encoding.Convert(
Encoding.UTF8,
Encoding.GetEncoding(
Encoding.ASCII.EncodingName,
new EncoderReplacementFallback(string.Empty),
new DecoderExceptionFallback()
),
Encoding.UTF8.GetBytes(inputString)
)
);
มันอาจดูยุ่งยาก แต่ควรใช้งานง่าย มันใช้การเข้ารหัส. NET ASCII เพื่อแปลงสตริง UTF8 ถูกนำมาใช้ในระหว่างการแปลงเพราะมันสามารถเป็นตัวแทนของตัวละครเดิมใด ๆ มันใช้ EncoderReplacementFallback เพื่อแปลงอักขระที่ไม่ใช่ ASCII ให้เป็นสตริงว่าง
ฉันเชื่อว่า MonsCamus หมายถึง:
parsememo = Regex.Replace(parsememo, @"[^\u0020-\u007E]", string.Empty);
หากคุณไม่ต้องการถอดออก แต่เพื่อแปลงลาตินที่เน้นเสียงเป็นตัวอักษรที่ไม่เน้นเสียงให้ดูที่คำถามนี้: ฉันจะแปลอักขระ 8 บิตเป็นอักขระ 7 บิตได้อย่างไร (เช่นÜถึง U)
แรงบันดาลใจจากโซลูชัน Expression ปกติของ philcruzฉันได้สร้างโซลูชัน LINQ อย่างแท้จริงแล้ว
public static string PureAscii(this string source, char nil = ' ')
{
var min = '\u0000';
var max = '\u007F';
return source.Select(c => c < min ? nil : c > max ? nil : c).ToText();
}
public static string ToText(this IEnumerable<char> source)
{
var buffer = new StringBuilder();
foreach (var c in source)
buffer.Append(c);
return buffer.ToString();
}
นี่คือรหัสที่ยังไม่ทดลอง
return new string( source.Where( c => c >= min && c <= max ).ToArray() );
ไม่จำเป็นต้องใช้ regex เพียงใช้การเข้ารหัส ...
sOutput = System.Text.Encoding.ASCII.GetString(System.Text.Encoding.ASCII.GetBytes(sInput));
????nacho??
เมื่อฉันลอง: たまねこnachoなち
ในขาวดำ 3.4
ฉันพบว่าช่วงที่เปลี่ยนแปลงเล็กน้อยต่อไปนี้มีประโยชน์สำหรับการแยกบล็อกความคิดเห็นออกจากฐานข้อมูลซึ่งหมายความว่าคุณไม่ต้องโต้แย้งกับแท็บและอักขระเลี่ยงซึ่งจะทำให้ฟิลด์ CSV กลายเป็นอารมณ์เสีย
parsememo = Regex.Replace(parsememo, @"[^\u001F-\u007F]", string.Empty);
หากคุณต้องการหลีกเลี่ยงอักขระพิเศษอื่น ๆ หรือเครื่องหมายวรรคตอนเฉพาะให้ตรวจสอบตาราง ascii
ฉันมาที่นี่เพื่อค้นหาวิธีแก้ปัญหาสำหรับอักขระ ascii ที่ขยายเพิ่ม ผมพบว่าที่ใกล้ที่สุดคือวิธีการแก้ปัญหาของ bzlm แต่ใช้งานได้กับรหัส ASCII ไม่เกิน 127 เท่านั้น (เห็นได้ชัดว่าคุณสามารถแทนที่ประเภทการเข้ารหัสในรหัสของเขาได้ แต่ฉันคิดว่ามันค่อนข้างซับซ้อนที่จะเข้าใจดังนั้นแบ่งปันเวอร์ชันนี้) ต่อไปนี้เป็นโซลูชันที่ใช้งานได้กับรหัส ASCII เพิ่มเติมเช่นสูงสุด 255ซึ่งเป็นISO 8859-1
ค้นหาและตัดส่วนอักขระที่ไม่ใช่ ASCII (มากกว่า 255)
Dim str1 as String= "â, ??î or ôu🕧� n☁i✑💴++$-💯♓!🇪🚑🌚‼⁉4⃣od;/⏬'®;😁☕😁:☝)😁😁///😍1!@#"
Dim extendedAscii As Encoding = Encoding.GetEncoding("ISO-8859-1",
New EncoderReplacementFallback(String.empty),
New DecoderReplacementFallback())
Dim extendedAsciiBytes() As Byte = extendedAscii.GetBytes(str1)
Dim str2 As String = extendedAscii.GetString(extendedAsciiBytes)
console.WriteLine(str2)
'Output : â, ??î or ôu ni++$-!‼⁉4od;/';:)///1!@#$%^yz:
นี่คือซอที่ใช้งานได้สำหรับโค้ด
แทนที่การเข้ารหัสตามความต้องการส่วนที่เหลือควรอยู่ในสภาพเดิม
นี่ไม่ใช่ประสิทธิภาพที่ดีที่สุด แต่เป็นวิธีที่ตรงไปตรงมา Linq:
string strippedString = new string(
yourString.Where(c => c <= sbyte.MaxValue).ToArray()
);
ข้อเสียคือตัวละคร "ที่รอดตาย" ทั้งหมดจะถูกใส่ลงในอาร์เรย์ประเภทแรกchar[]
ซึ่งจะถูกโยนทิ้งไปหลังจากตัวstring
สร้างไม่ได้ใช้อีกต่อไป
ฉันใช้นิพจน์ regex นี้:
string s = "søme string";
Regex regex = new Regex(@"[^a-zA-Z0-9\s]", (RegexOptions)0);
return regex.Replace(s, "");
ฉันใช้นิพจน์ทั่วไปนี้เพื่อกรองอักขระที่ไม่ดีในชื่อไฟล์
Regex.Replace(directory, "[^a-zA-Z0-9\\:_\- ]", "")
นั่นควรเป็นอักขระทั้งหมดที่อนุญาตให้ใช้ชื่อไฟล์