В прямом JavaScript Вы могли сделать что-то подобное следующему:
var kvpairs = [];
var form = // get the form somehow
for ( var i = 0; i < form.elements.length; i++ ) {
var e = form.elements[i];
kvpairs.push(encodeURIComponent(e.name) + "=" + encodeURIComponent(e.value));
}
var queryString = kvpairs.join("&");
Короче говоря, это создает список пар "ключ-значение" (name=value), который тогда объединен с помощью "&"; как разделитель.
Если вам нужно иметь дело с прописными и строчными буквами, вы можете сделать что-то вроде:
if (letter >= 'A' && letter <= 'Z')
num = letter - 'A';
else if (letter >= 'a' && letter <= 'z')
num = letter - 'a';
Если вы хотите отобразить их, тогда вы захотите преобразовать число в значение ascii, добавив к нему «0»:
asciinumber = num + '0';
Есть способ лучше.
В ASCII ( www.asciitable.com ) вы можете узнать числовые значения этих символов.
'A 'равно 0x41.
Таким образом, вы можете просто вычесть из них 0x41, чтобы получить числа. Я не очень хорошо знаю c, но что-то вроде:
int num = 'A' - 0x41;
должно работать.
Еще одна, гораздо худшая (но все же лучше, чем 26 операторов if
) альтернатива - использовать переключатель
/ case
:
switch(letter)
{
case 'A':
case 'a': // don't use this line if you want only capital letters
num = 0;
break;
case 'B':
case 'b': // same as above about 'a'
num = 1;
break;
/* and so on and so on */
default:
fprintf(stderr, "WTF?\n");
}
Учитывайте это, только если нет абсолютно никакой связи между буквой и ее кодом. Поскольку в вашем случае существует четкая последовательная связь между буквой и кодом, использовать это довольно глупо и будет ужасно поддерживать, но если вам нужно было кодировать случайные символы в случайные значения, это был бы способ избежать записи миллион if ()
/ else if ()
/ else if ()
/ else
операторов.
В большинстве языков программирования и сценариев есть средства для получения "порядкового" значения любого символа. (Думайте об этом как о смещении от начала набора символов.)
Таким образом, вы обычно можете сделать что-то вроде:
for ch in somestring:
if lowercase(ch):
n = ord(ch) - ord ('a')
elif uppercase(ch):
n = ord(ch) - ord('A')
else:
n = -1 # Sentinel error value
# (or raise an exception as appropriate to your programming
# environment and to the assignment specification)
Конечно, это не сработает для системы на основе EBCDIC (и может не сработать для некоторых других экзотические наборы символов). Я полагаю, что разумной проверкой было бы, если бы эта функция вернула монотонно возрастающие значения в диапазоне 0..26 для строк «abc ... xzy» и «ABC ... XYZ»).
Совсем другое. подход заключался бы в создании ассоциативного массива (словаря, таблицы, хеша) ваших букв и их значений (один или два простых цикла). Тогда используйте это. (Большинство современных языков программирования включают поддержку ассоциативных массивов.
Естественно, я не "
Я считаю, что этот способ лучше, чем метод переключателя
, но при этом он соответствует стандартам (не предполагает ASCII):
#include <string.h>
#include <ctype.h>
/* returns -1 if c is not an alphabetic character */
int c_to_n(char c)
{
int n = -1;
static const char * const alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
char *p = strchr(alphabet, toupper((unsigned char)c));
if (p)
{
n = p - alphabet;
}
return n;
}
Поскольку тип данных char обрабатывается аналогично типу данных int в C и C ++, вы можете использовать что-нибудь вроде:
char c = 'A'; // just some character
int urValue = c - 65;
Если вас беспокоит чувствительность к регистру:
#include <ctype.h> // if using C++ #include <cctype>
int urValue = toupper(c) - 65;
Ой, если бы у вас был C ++
Для юникода определение того, как отображать символы в значения
typedef std::map<wchar_t, int> WCharValueMap;
WCharValueMap myConversion = fillMap();
WCharValueMap fillMap() {
WCharValueMap result;
result[L'A']=0;
result[L'Â']=0;
result[L'B']=1;
result[L'C']=2;
return result;
}
использование
int value = myConversion[L'Â'];