Asp.net Строка.Подсчет длины возвращает как 2 символа?

#c# #asp.net #string

#c# #asp.net #строка

Вопрос:

Я подсчитываю символы сообщения из текстового поля, которое будет отправлено в виде sms, я заметил, что txtBody.Text.Length подсчитывает больше символов для возвратов, понимаю, я хочу сохранить форматирование новой строки, но .net считает для этого 2 символа, есть ли какой-либо способ сохранить новую строку, но сделать счетчик точным или сам возврат состоит из 2 символов???

Комментарии:

1. Будьте осторожны, игнорируя количество символов новой строки, если вы сохраняете их в SMS-сообщении — они все равно будут учитываться в количестве 168 символов в SMS

2. @Neil 168? Я знаю сценарии кодирования, которые предлагают 160, 140, 70 (считая суррогаты по одному каждому) и 155 символов на одно сообщение. Когда вы сможете получить 168?

3. @Jon Моя ошибка — это 160 символов. Тоже не знаю, откуда я взял 168. Добавьте модульный тест для этого.

4. лол. Тем не менее, это случаи 140, 70 и 155 символов, которые действительно нуждаются в модульном тестировании в реальном коде, хотя 155 настолько зависят от оператора, что, возможно, их лучше игнорировать.

5. @neil, дело не в том, что я не считаю новую строку, а в том, что я не хочу считать окружение. Новая строка, состоящая из 2 символов вместо того, что должно быть одним (» n») в строке sms so. длина становится непригодной для оценки, если вы сначала не измените строку.

Ответ №1:

Новая строка в Windows действительно состоит из 2 символов — CrLf — ASCII 13, за которым следует ASCII 10.

Вы можете просто уменьшить 2 от возвращаемого Length или получить количество всех Environment.NewLine , удвоить это на 2 и уменьшить от Length .

Ответ №2:

Ввод в текстовое поле будет выдавать вас Environment.Newline всякий раз, когда пользователь вводит новую строку (за исключением некоторых относительно странных операций копирования-вставки), которая в Windows совпадает с "u000Du000A" (или короче "rn" , что означает то же самое).

Для отправки SMS вам действительно нужно использовать только U 000A.

Следовательно, вы можете просто сделать msg.Replace("rn", "n") , прежде чем выполнять какую-либо дальнейшую работу. Вы не только получите желаемый результат длины, но и сократите количество потраченных впустую символов, которые не нужны SMSS, и каждый символ имеет значение, когда дело доходит до SMS, hnce hrribl nnsens lik dis!

Вы могли бы также продолжить нормализацию, чтобы msg.Replace("rn", "n").Replace('r', 'n') придать больше смысла странным скопированным данным с разрывами строк, отличными от Windows-normal (случается в некоторых сценариях).

Обратите внимание, что у вас возникнет больше сложностей, если вы не сможете придерживаться 7-битного алфавита GSM, хотя, если вы также не сможете придерживаться 8-битного, тогда, по крайней мере, ваши сложности будут соответствовать .NET и SMS; с тех пор .NET использует UTF-16, а SMS использует, когда других кодировок недостаточно, они обрабатывают суррогаты одинаково в отношении длины.

Комментарии:

1. спасибо, это ответило мне полностью. Система не разрешает копирование из других источников, поэтому все может быть в порядке с msg.Replace(» r n», » n»).. Спасибо

2. r в любом случае не причинил бы никакого вреда, его просто удобно нормализовать, когда дело доходит до других задач.

Ответ №3:

 string msg = "bla bla etc.rnSome more bla";
int length = msg.Replace("rn","").Length;