Что лучший способ состоит в том, чтобы сохранить строки UTF-8 в памяти в C/C++?

Лучше всего начать с вкладки «Сеть» инструментов разработчика браузера. Там, вы можете увидеть исходящий запрос и то, что он возвращает с .

Откройте свою форму в браузере и запустите событие click. Затем найдите запрос к getItem.php и посмотрите на его ответ . Если это не то, что вы ожидаете, установите getItem.php на echo 'hello' и умрите; если вкладка сети не показывает «привет» в ответе, это означает, что вы не достигли конечной точки. Если вы видите «привет», поздравляю, вы близки!

Что касается вашей фактической конечной точки, я вижу, что вы неоднократно повторяли результаты вашего запроса. Это не самый полезный способ сделать это. Вместо этого json_encode весь набор результатов, вывести его на экран и уничтожить скрипт . Это вернет все строки вашей таблицы в виде массива JSON, который затем может быть прочитан с помощью javscript обратно на стороне клиента. . Я надеюсь, что все это поможет!

9
задан Anteru 12 January 2009 в 11:22
поделиться

6 ответов

Существует библиотека под названием "UTF8-CPP", который позволяет Вам сохранить свои строки UTF-8 в стандартном станд.:: представьте объекты в виде строки, и обеспечивает дополнительные функции, чтобы перечислить и управлять utf-8 символами.

Я еще не протестировал его, таким образом, я не знаю то, что это стоит, но я рассматриваю использование его сам.

5
ответ дан 4 December 2019 в 14:32
поделиться

strlen считает количество непустых символов перед первыми \0. В UTF-8 то количество является нормальным числом (число используемых байтов), но количество не является количеством символов (один символ UTF-8 обычно является 1-4 символами). basic_string не хранит \0, но он также проводит подсчет байта.

strcpy или basic_string копируют копию ctor все байты, не смотря слишком тесно.

Нахождение подстроки работает хорошо из-за способа, которым кодируется UTF_8. Позволенные значения для первого байта символа отличны от второго до 4-го байта (первый никогда не запускает с 10xxxxxx, последний всегда),

Взятие подстроки хитро - как Вы указываете положение? Если начинание и конец были найдены путем поиска маркеров текста ASCII (например, [и]) затем нет никакой проблемы. Вы просто получили бы байты в середине, которые являются допустимой строкой UTF8 также. Вы не можете harcode положения или даже относительные смещения все же. Даже относительное смещение +1 символа может быть трудным; сколько байтов это? Вы закончите тем, что писали функцию как SkipOneChar.

3
ответ дан 4 December 2019 в 14:32
поделиться

Пример с библиотекой ICU (C, C++, Java):

#include <iostream>
#include <unicode/unistr.h> // using ICU library

int main(int argc, char *argv[]) {
    // constructing a Unicode string
    UnicodeString ustr1("Привет"); // using platform's default codepage
    // calculating the length in characters, should be 6
    int ulen1=ustr1.length();
    // extracting encoded characters from a string
    int const bufsize=25;
    char encoded[bufsize];
    ustr1.extract(0,ulen1,encoded,bufsize,"UTF-8"); // forced UTF-8 encoding
    // printing the result
    std::cout << "Length of " << encoded << " is " << ulen1 << "\n";
    return 0;
}

здание как

$ g++ -licuuc -o icu-example{,.cc}

выполнение

$ ./icu-example
Length of Привет is 6

Работы для меня на Linux с GCC 4.3.2 и libicu 3.8.1. Обратите внимание на то, что это печатает в UTF-8, какова системная локаль. Вы не будете видеть, что это правильно, если Ваш не UTF-8.

3
ответ дан 4 December 2019 в 14:32
поделиться

Это зависит, что Вы хотите сделать со Строкой UTF8. Если все, чем Вы интересуетесь, читает в и строки UTF8 затем, все это работает, пока Вы установили корректную локаль. Мы делали это в течение некоторого времени. У нас есть несколько серверных процессов, которые ничего не делают со строками как таковыми. Там представляет в виде строки, установлены пользователем в Java и прибывают как UTF8, и мы обрабатываем их в стандарте c буферы ул. Мы затем передаем данные обратно Java, который преобразовывает их назад.

Если Вы хотите длину в символах UTF8 затем, Вы хотите функции, которые могут обработать перевод для Вас.

Но можно прокрутить собственное, например, utf8-strlen

2
ответ дан 4 December 2019 в 14:32
поделиться

С чем мы обосновались: сохраните UTF8 в станд.:: строка. Можно сделать большинство операций теперь, за исключением вещей как вычисления длины. Используйте UTF8-> станд.:: функция преобразования wstring (повышение:: from_utf8, например) для преобразования в станд.:: wstring, когда Вам нужны такие операции.

1
ответ дан 4 December 2019 в 14:32
поделиться

От UTF-8 и Unicode FAQ: C поддерживают для Unicode:

#include <stdio.h>
#include <locale.h>

int main()
{
  if (!setlocale(LC_CTYPE, "")) {
    fprintf(stderr, "Can't set the specified locale! "
            "Check LANG, LC_CTYPE, LC_ALL.\n");
    return 1;
  }
  printf("%ls\n", L"Schöne Grüße");
  return 0;
}

Также отсюда:

Хорошие новости - это, если Вы используете wchar_t* строки и семейство функций, связанных с ними такой как wprintf, wcslen, и wcslcat, Вы имеете дело со значениями Unicode. В мире C++ можно использовать std::wstring обеспечить дружественный интерфейс. Моя единственная жалоба - то, что это 32-разрядные (4-байтовые) символы, таким образом, они - пожиратели ресурсов памяти для всех языков. Причина этого выбора состоит в том, что он гарантирует, что каждый возможный символ может быть представлен одним значением.

PS. Это является, вероятно, определенным для Linux. Существует библиотека ICU для обработки сложных вещей.

0
ответ дан 4 December 2019 в 14:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: