#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;