Решение Timmerman отлично работает при запуске кода, но если вы не хотите получать ошибки Undefined name
при использовании pyflakes или аналогичного linter, вы можете использовать следующее:
try:
import __builtin__
input = getattr(__builtin__, 'raw_input')
except (ImportError, AttributeError):
pass
Для усечения строки к массиву байтов UTF8, не разделяя посреди символа, я использую это:
static string Truncate(string s, int maxLength) {
if (Encoding.UTF8.GetByteCount(s) <= maxLength)
return s;
var cs = s.ToCharArray();
int length = 0;
int i = 0;
while (i < cs.Length){
int charSize = 1;
if (i < (cs.Length - 1) && char.IsSurrogate(cs[i]))
charSize = 2;
int byteSize = Encoding.UTF8.GetByteCount(cs, i, charSize);
if ((byteSize + length) <= maxLength){
i = i + charSize;
length += byteSize;
}
else
break;
}
return s.Substring(0, i);
}
Возвращаемая строка может затем быть безопасно передана массиву байтов длины maxLength.
Необходимо ли использовать класс Кодирования, чтобы сделать преобразование в корректный массив байтов? Все объекты Кодирования имеют переопределенный метод GetMaxCharCount, который даст Вам "Максимальное количество символов, произведенных путем декодирования конкретного количества байтов". Необходимо смочь использовать это значение, чтобы обрезать строку и правильно закодировать его.
Классу Кодирования в.NET назвали метод GetByteCount
который может взять в строке или символе []. Если Вы передадите в 1 символе, то он скажет Вам, сколько байтов необходимо для того 1 символа в том, какой бы ни кодирование Вас использует.
Метод GetMaxByteCount
быстрее, но это делает худшее вычисление случая, которое могло возвратить более высокое количество, чем на самом деле необходимо.
Эффективный путь нашел бы, с каким количеством (пессимистически) байты Вы будете нуждаться на символ
Encoding.GetMaxByteCount(1);
затем деление Вашего размера строки результатом, затем преобразование так многого изображают с
public virtual int Encoding.GetBytes (
string s,
int charIndex,
int charCount,
byte[] bytes,
int byteIndex
)
Если Вы хотите использовать меньше использования памяти
Encoding.GetByteCount(string);
но это - намного более медленный метод.