Работа с символами, отличными от ASCII, в файлах HDF5

Чтобы разрешить совместное использование файлов HDF5 с несколькими локалями, MATLAB® поддерживает использование символов, отличных от ASCII, в файлах с HDF5. В этом примере показано, как:

  • Создайте файлы HDF5, содержащие имена набора данных и атрибутов, которые имеют символы, отличные от ASCII, используя функции высокого уровня.

  • Создайте наборы строковых наборов данных переменной длины, содержащие символы, отличные от ASCII, используя низкоуровневые функции.

Создайте имена набора данных и атрибутов, содержащие символы, отличные от ASCII

Создайте файл HDF5, содержащий имя набора данных и имя атрибута, который содержит символы, отличные от ASCII. Чтобы проверить, как ожидалось, отображаются ли имена набора данных и атрибутов, запишите данные в набор данных и отобразите информацию о файле.

Создайте набор данных с именем (/数据集), который включает символы, отличные от ASCII.

dsetName = ['/' char([25968 25454 38598])];
dsetDims = [5 2];
h5create('outfile.h5',['/grp1' dsetName],dsetDims,...
                                'TextEncoding','UTF-8');
Запись данных в файл.
dataToWrite = rand(dsetDims);
h5write('outfile.h5',['/grp1' dsetName],dataToWrite);

Создайте имя атрибута (屬性名稱), который включает символы, отличные от ASCII, и присваивает значение атрибуту.

attrName = char([25967 25453 38597]);
h5writeatt('outfile.h5','/',attrName,'I am an attribute',...
                                      'TextEncoding','UTF-8');

Отобразите информацию о файле и проверьте, правильно ли отображаются имя атрибута и имя набора данных.

h5disp('outfile.h5')
HDF5 outfile.h5 
Group '/' 
    Attributes:
        '/屬性名稱':  'I am an attribute'
    Group '/grp1' 
        Dataset '数据集' 
            Size:  5x2
            MaxSize:  5x2
            Datatype:   H5T_IEEE_F64LE (double)
            ChunkSize:  []
            Filters:  none
            FillValue:  0.000000

Создайте строковые данные переменной длины, содержащие символы, отличные от ASCII

Создайте набор строковых наборов данных переменной длины для хранения данных, содержащих символы, отличные от ASCII, с помощью низкоуровневых функций. Запишите данные в набор данных. Проверьте, правильно ли записаны данные.

Создайте данные, содержащие символы, отличные от ASCII.

dataToWrite = {char([12487 12540 12479]) 'hello' ...
                   char([1605 1585 1581 1576 1575]); ...
               'world' char([1052 1080 1088])    ...
                   char([954 972 963 956 959 962])};
disp(dataToWrite)
    'データ'    'hello'    'مرحبا' 
    'world'    'Мир'      'κόσμος'

Чтобы записать эти данные в файл, создайте файл HDF5, задайте имя группы и имя набора данных в группе.

Создайте файл HDF5.

fileName = 'outfile.h5';
fileID = H5F.create(fileName,'H5F_ACC_TRUNC',...
                     'H5P_DEFAULT', 'H5P_DEFAULT');

Чтобы создать группу, содержащую символы, отличные от ASCII, в ее имени, сначала настройте свойство создания ссылок.

lcplID = H5P.create('H5P_LINK_CREATE'); 
H5P.set_char_encoding(lcplID,H5ML.get_constant_value('H5T_CSET_UTF8'));
plist = 'H5P_DEFAULT';

Затем создайте группу (グループ).

grpName = char([12464 12523 12540 12503]);
grpID = H5G.create(fileID,grpName,lcplID,plist,plist);

Создайте набор данных, который содержит строковые данные переменной длины с символами, отличными от ASCII. Сначала сконфигурируйте его тип данных.

typeID = H5T.copy('H5T_C_S1');
H5T.set_size(typeID,'H5T_VARIABLE');
H5T.set_cset(typeID,H5ML.get_constant_value('H5T_CSET_UTF8'));

Теперь создайте набор данных, указав его имя, тип данных и размерности.

dsetName = 'datasetUtf8';
dataDims = [2 3];
h5DataDims = fliplr(dataDims);
h5MaxDims = h5DataDims;
spaceID = H5S.create_simple(2,h5DataDims,h5MaxDims);
dsetID = H5D.create(grpID,dsetName,typeID,spaceID,...
             'H5P_DEFAULT','H5P_DEFAULT','H5P_DEFAULT');

Запишите данные в набор данных.

H5D.write(dsetID,'H5ML_DEFAULT','H5S_ALL',...
               'H5S_ALL','H5P_DEFAULT',dataToWrite);

Считайте данные назад.

dataRead = h5read('outfile.h5',['/' grpName '/' dsetName])
dataRead =

  2×3 cell array

    {'データ'}    {'hello'}    {'مرحبا' }
    {'world'}    {'Мир'  }    {'κόσμος'}

Проверьте, соответствуют ли данные в файле записанным данным.

isequal(dataRead,dataToWrite)
ans =

  logical

   1

Закройте идентификаторы.

H5D.close(dsetID);
H5S.close(spaceID);
H5T.close(typeID);
H5G.close(grpID);
H5P.close(lcplID);
H5F.close(fileID);

См. также

| | | | | | | |