Есть ли регистр символов Unicode без учета регистра? - PullRequest
1 голос
/ 29 сентября 2010

Я использую следующий код для кодирования символов кодировки Unicode. Это дает мне другое строковое значение MD5EncryptedString, когда я использую значение DataToEncrypt как 'abc' & 'ABC'

 String DataToEncrypt="abc";
 String MD5EncryptedString = String.Empty;
 MD5 md5 = new MD5CryptoServiceProvider();
 Byte[] encodedBytes = ASCIIEncoding.Default.GetBytes(DataToEncrypt);
 // Byte[] encodedBytes = UTF8Encoding.Default.GetBytes(DataToEncrypt);
  encodedBytes = md5.ComputeHash(encodedBytes);
  MD5EncryptedString = BitConverter.ToString(encodedBytes);
 return MD5EncryptedString;

Есть ли какой-нибудь класс вместо ASCIIEncoding, который даст мне нечувствительную к регистру строку, означает, что он даст мне одинаковое значение MD5EncryptedString для обоих 'abc' и 'ABC' для переменной DataToEncrypt?

Ответы [ 3 ]

1 голос
/ 29 сентября 2010

Ваш текущий код не использует либо ASCIIEncoding или UTF8Encoding ... он использует кодировку по умолчанию в системе, поскольку он эквивалентен просто Encoding.Default , Доступ к этому статическому свойству через два подкласса не имеет значения.

Чтобы использовать ASCII или UTF-8, используйте Encoding.ASCII или Encoding.UTF8.

Теперь, что касается чувствительности к регистру ... нет, дело не в кодировках. Ваш вопрос довольно запутанный, поскольку он утверждает, что означает , что дает вам одинаковый результат для "abc" и "ABC", в чем я серьезно сомневаюсь. Я предполагаю, что вы имеете в виду, что вы хотите , чтобы получить тот же результат, но в настоящее время это не так.

Я предлагаю вам использовать что-то вроде этого, если вы хотите нечувствительность к регистру:

string lower = string.ToLowerInvariant();
byte[] data = Encoding.UTF8.GetBytes(lower);
byte[] hash = md5.ComputeHash(encodedBytes);
return BitConverter.ToString(hash);

Обратите внимание, что это дает нечувствительность к регистру нечувствительным к культуре способом ... который может быть не идеальным во всех случаях, но по крайней мере непротиворечивым независимо от используемой культуры.

0 голосов
/ 29 сентября 2010

Перевод символьных символов в порядковые номера (байты) ВСЕГДА даст вам другой ответ, когда вы кодируете прописные и строчные буквы, потому что эти два символа представлены двумя разными байт-кодами в кодовой странице.Это верно для любой кодировки символов, будь то ASCII, Unicode и т. Д.

Чтобы получить регистр без учета регистра, всегда вызывайте ToUpper () для строки перед ее кодированием в байты и хэшированием.

0 голосов
/ 29 сентября 2010

Все кодировки символов кодируют буквы верхнего и нижнего регистра, используя разные байты, поэтому нет способа получить кодировку, которая сделает это за вас.

Вы всегда можете использовать строчные / прописные буквы перед хэшированием.

...