C#で文字列をutf8からASCII(シングルバイト)に変換(音訳)するにはどうすればよいですか?
-
20-08-2019 - |
質問
文字列オブジェクトがあります
「複数の文字や特殊文字も使用」
使用しようとしています
UTF8Encoding utf8 = new UTF8Encoding();
ASCIIEncoding ascii = new ASCIIEncoding();
オブジェクトを使用して文字列を ASCII に変換します。誰かに、午後の狩猟という単純な仕事に光を当ててくれるよう頼んでもいいでしょうか。
編集1:私たちが達成しようとしているのは、Windows の特殊なアポストロフィのような特殊文字を取り除くことです。以下に回答として投稿したコードはそれを処理しません。基本的に
オブライアンはオブライアンになります。ここで、 ' は特殊なアポストロフィの 1 つです
解決
これはあなたの別の質問に対する回答でしたが、削除されたようです...要点はまだ残っています。
のように見えます Unicode から ASCII への古典的な問題. 。秘訣は見つけることです どこ それが起こっています。
.NET は Unicode で正常に動作します。 Unicodeだと言われています 最初から (またはデフォルトのまま)。
私の 推測 それは受信アプリがそれを処理できないということです。したがって、私はおそらく、 アスキーエンコーダ と の エンコーダの置換フォールバック String.Empty を使用:
using System.Text;
string inputString = GetInput();
var encoder = ASCIIEncoding.GetEncoder();
encoder.Fallback = new EncoderReplacementFallback(string.Empty);
byte[] bAsciiString = encoder.GetBytes(inputString);
// Do something with bytes...
// can write to a file as is
File.WriteAllBytes(FILE_NAME, bAsciiString);
// or turn back into a "clean" string
string cleanString = ASCIIEncoding.GetString(bAsciiString);
// since the offending bytes have been removed, can use default encoding as well
Assert.AreEqual(cleanString, Default.GetString(bAsciiString));
もちろん、昔はただループして文字を削除していました。 127より大きい...そうですね、少なくとも米国にいる私たちにとっては。;)
他のヒント
私はそれを把握することができました。場合、誰かが私のために働いたコードの下に知って欲しいます:
ASCIIEncoding ascii = new ASCIIEncoding();
byte[] byteArray = Encoding.UTF8.GetBytes(sOriginal);
byte[] asciiArray = Encoding.Convert(Encoding.UTF8, Encoding.ASCII, byteArray);
string finalString = ascii.GetString(asciiArray);
それをやっO簡単な方法があるかどうか私に教えてくださいます。
は、拡張メソッドを好きな人のために、この1つは私たちのためにトリックを行います。
using System.Text;
namespace System
{
public static class StringExtension
{
private static readonly ASCIIEncoding asciiEncoding = new ASCIIEncoding();
public static string ToAscii(this string dirty)
{
byte[] bytes = asciiEncoding.GetBytes(dirty);
string clean = asciiEncoding.GetString(bytes);
return clean;
}
}
}
(System名前空間は、それが私たちのすべての文字列のためにほとんど自動的に利用可能です。)
上記のマークの答え(およびジオさんのコメント)に基づいて、私は、文字列からすべてのASCII例外ケースを削除するには、2つのライナーのバージョンを作成しました。 (私が行ったように)この答えを探して人々のために用意ます。
using System.Text;
// Create encoder with a replacing encoder fallback
var encoder = ASCIIEncoding.GetEncoding("us-ascii",
new EncoderReplacementFallback(string.Empty),
new DecoderExceptionFallback());
string cleanString = encoder.GetString(encoder.GetBytes(dirtyString));
多くのエンコーディングで使用される文字を 8 ビットで表現したい場合、これが役に立つかもしれません。
変数を変更する必要があります ターゲットエンコーディング 任意のエンコーディングに変更します。
Encoding targetEncoding = Encoding.GetEncoding(874); // Your target encoding
Encoding utf8 = Encoding.UTF8;
var stringBytes = utf8.GetBytes(Name);
var stringTargetBytes = Encoding.Convert(utf8, targetEncoding, stringBytes);
var ascii8BitRepresentAsCsString = Encoding.GetEncoding("Latin1").GetString(stringTargetBytes);