powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Кириллица в 1 байт
25 сообщений из 32, страница 1 из 2
Кириллица в 1 байт
    #38365952
Николаха
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте! Не могу сообразить с кодировками! Стоит задача подать строку символов длиной 30800 байт одной функции в dll-ке, проблема в том что там присутствуют кириллические заглавные буквы! Если эта строка из пробелов:
Код: java
1.
2.
String str="                    "........."                       ";
System.out.println("Length="+str.length()+" bytes:"+str.getBytes().length);     //выведет Length=30800 bytes:30800



как только её заполнишь по нужному формату, например "123456789ААААААА БББББББ ВВВВВВВВВВВВ "

Код: java
1.
2.
String str="123456789ААААААА                БББББББ                              ВВВВВВВВВВВВ                                                 ";
System.out.println("Length="+str.length()+" bytes:"+str.getBytes().length);     //выведет Length=30800 bytes:30827



получается что буквы по 2 байта занимают! Можно ли это сделать в 1 байт???
...
Рейтинг: 0 / 0
Кириллица в 1 байт
    #38366021
avp.mk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
        Charset
                win = Charset.forName("cp1251"),
                dos = Charset.forName("cp866");
        
        byte[] bytesWin = "Так можно".getBytes(win);
        byte[] bytesDos = "Так можно тоже".getBytes(dos);

        System.out.println(Arrays.toString(bytesWin));
        System.out.println(Arrays.toString(bytesDos));
...
Рейтинг: 0 / 0
Кириллица в 1 байт
    #38367000
Николаха
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Мне нужно подать строку символов длиной 30800 байт.
Если в строке находится кириллица, то каждая буква занимает 2 байта и соответственно строка становиться больше, например 30827 байт, а надо чтобы она была 30800 байт даже с кириллицей!
...
Рейтинг: 0 / 0
Кириллица в 1 байт
    #38367003
avp.mk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В джаве каждая буква занимает 2 байта, без разницы кириллица это или латиница (а иногда и 4).

Показывай вызов функции.
...
Рейтинг: 0 / 0
Кириллица в 1 байт
    #38367051
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НиколахаМне нужно подать строку символов длиной 30800 байт.
На обед подать? Кому? Длина строки меряется символами, а не байтами.
...
Рейтинг: 0 / 0
Кириллица в 1 байт
    #38367055
Николаха
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
avp.mkВ джаве каждая буква занимает 2 байта, без разницы кириллица это или латиница (а иногда и 4).

Показывай вызов функции.

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
String ru = "Иванов Иван";
String en = "Ivanov Ivan";
        
System.out.println("Length="+ru.length()+" Byte:"+ru.getBytes().length);
System.out.println("Length="+en.length()+" Byte:"+en.getBytes().length);

--------------------------------------
Length=11 Byte:21
Length=11 Byte:11
...
Рейтинг: 0 / 0
Кириллица в 1 байт
    #38367061
Николаха
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Blazkowicz,

есть DLL. я его использую. у него есть функция которая в качестве вх параметра принимает строку. У неё в инструкции написано "необходимо подать строку символов длиной 30800 байт"
...
Рейтинг: 0 / 0
Кириллица в 1 байт
    #38367089
maxkar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Николаха,

У неё в инструкции написано "необходимо подать строку символов длиной 30800 байт"
А в какой кодировке ей нужно строку подать? Вот и получайте байты строки в нужной кодировке. Примеры в ответах уже были. Если кодировка UTF-8, то никак вы меньше байт не сделаете.

И вообще, как вы ей строку передаете? В какой момент строка в тип для dll'ки конвертируется?
...
Рейтинг: 0 / 0
Кириллица в 1 байт
    #38367111
Николаха
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
maxkarНиколаха,

У неё в инструкции написано "необходимо подать строку символов длиной 30800 байт"
А в какой кодировке ей нужно строку подать? Вот и получайте байты строки в нужной кодировке. Примеры в ответах уже были. Если кодировка UTF-8, то никак вы меньше байт не сделаете.

И вообще, как вы ей строку передаете? В какой момент строка в тип для dll'ки конвертируется?

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
String ru = "Иванов Иван";
String en = "Ivanov Ivan";
        
System.out.println("Length="+ru.length()+" Byte:"+ru.getBytes("Cp1251").length);
System.out.println("Length="+en.length()+" Byte:"+en.getBytes().length);

--------------------------------------
Length=11 Byte:11
Length=11 Byte:11



как получить массив байтов я понял!
я использую NativeCall
Код: java
1.
2.
3.
4.
NativeCall.init(pathNativeCallDll);
check = new IntCall(filePrchdblDll.getAbsolutePath(), "_AS_Run_findgg");
Object[] obj = new Object[] {newString}; //вот сама и строка которую надо передать!
boolean res = check.executeBooleanCall(obj);
...
Рейтинг: 0 / 0
Кириллица в 1 байт
    #38367141
avp.mk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Николахаavp.mkВ джаве каждая буква занимает 2 байта, без разницы кириллица это или латиница (а иногда и 4).

Показывай вызов функции.

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
String ru = "Иванов Иван";
String en = "Ivanov Ivan";
        
System.out.println("Length="+ru.length()+" Byte:"+ru.getBytes().length);
System.out.println("Length="+en.length()+" Byte:"+en.getBytes().length);

--------------------------------------
Length=11 Byte:21
Length=11 Byte:11


Внезапно))


Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
package ulanude;

import java.nio.charset.Charset;
import static java.nio.charset.Charset.availableCharsets;
import java.util.Map;
import java.util.Set;

public class UlanUde {

    private static final String MESSAGE = "Улан-Удэ (это где оз.Байкал)";

    public static void main(String[] args) {
        int charsetNameMaxLength = 0;
        Set<Map.Entry<String, Charset>> entrySet = availableCharsets().entrySet();
        for (Map.Entry<String, Charset> entry : entrySet) {
            int length = entry.getKey().length();
            if (charsetNameMaxLength < length) {
                charsetNameMaxLength = length;
            }
        }

        String format = "Кодировка: %" + charsetNameMaxLength + "s : %s\n";
        for (Map.Entry<String, Charset> entry : entrySet) {
            String charsetName = entry.getKey();
            try {
                System.out.printf(format, charsetName, MESSAGE.getBytes(entry.getValue()).length);
            } catch (Throwable t) {
                String message = t.getMessage();
                System.out.printf(format, charsetName, message == null ? "Не поддерживается." : "Не поддерживается. Причина: " + message);
            }
        }
    }
}


output
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
run:
Кодировка:                Big5 : 48
Кодировка:          Big5-HKSCS : 49
Кодировка:              EUC-JP : 49
Кодировка:              EUC-KR : 49
Кодировка:             GB18030 : 49
Кодировка:              GB2312 : 49
Кодировка:                 GBK : 49
Кодировка:            IBM-Thai : 28
Кодировка:            IBM00858 : 28
Кодировка:            IBM01140 : 28
Кодировка:            IBM01141 : 28
Кодировка:            IBM01142 : 28
Кодировка:            IBM01143 : 28
Кодировка:            IBM01144 : 28
Кодировка:            IBM01145 : 28
Кодировка:            IBM01146 : 28
Кодировка:            IBM01147 : 28
Кодировка:            IBM01148 : 28
Кодировка:            IBM01149 : 28
Кодировка:              IBM037 : 28
Кодировка:             IBM1026 : 28
Кодировка:             IBM1047 : 28
Кодировка:              IBM273 : 28
Кодировка:              IBM277 : 28
Кодировка:              IBM278 : 28
Кодировка:              IBM280 : 28
Кодировка:              IBM284 : 28
Кодировка:              IBM285 : 28
Кодировка:              IBM297 : 28
Кодировка:              IBM420 : 28
Кодировка:              IBM424 : 28
Кодировка:              IBM437 : 28
Кодировка:              IBM500 : 28
Кодировка:              IBM775 : 28
Кодировка:              IBM850 : 28
Кодировка:              IBM852 : 28
Кодировка:              IBM855 : 28
Кодировка:              IBM857 : 28
Кодировка:              IBM860 : 28
Кодировка:              IBM861 : 28
Кодировка:              IBM862 : 28
Кодировка:              IBM863 : 28
Кодировка:              IBM864 : 28
Кодировка:              IBM865 : 28
Кодировка:              IBM866 : 28
Кодировка:              IBM868 : 28
Кодировка:              IBM869 : 28
Кодировка:              IBM870 : 28
Кодировка:              IBM871 : 28
Кодировка:              IBM918 : 28
Кодировка:         ISO-2022-CN : Не поддерживается.
Кодировка:         ISO-2022-JP : 85
Кодировка:       ISO-2022-JP-2 : 85
Кодировка:         ISO-2022-KR : 65
Кодировка:          ISO-8859-1 : 28
Кодировка:         ISO-8859-13 : 28
Кодировка:         ISO-8859-15 : 28
Кодировка:          ISO-8859-2 : 28
Кодировка:          ISO-8859-3 : 28
Кодировка:          ISO-8859-4 : 28
Кодировка:          ISO-8859-5 : 28
Кодировка:          ISO-8859-6 : 28
Кодировка:          ISO-8859-7 : 28
Кодировка:          ISO-8859-8 : 28
Кодировка:          ISO-8859-9 : 28
Кодировка:           JIS_X0201 : 28
Кодировка:      JIS_X0212-1990 : 56
Кодировка:              KOI8-R : 28
Кодировка:              KOI8-U : 28
Кодировка:           Shift_JIS : 49
Кодировка:             TIS-620 : 28
Кодировка:            US-ASCII : 28
Кодировка:              UTF-16 : 58
Кодировка:            UTF-16BE : 56
Кодировка:            UTF-16LE : 56
Кодировка:              UTF-32 : 112
Кодировка:            UTF-32BE : 112
Кодировка:            UTF-32LE : 112
Кодировка:               UTF-8 : 49
Кодировка:        windows-1250 : 28
Кодировка:        windows-1251 : 28
Кодировка:        windows-1252 : 28
Кодировка:        windows-1253 : 28
Кодировка:        windows-1254 : 28
Кодировка:        windows-1255 : 28
Кодировка:        windows-1256 : 28
Кодировка:        windows-1257 : 28
Кодировка:        windows-1258 : 28
Кодировка:         windows-31j : 49
Кодировка:   x-Big5-HKSCS-2001 : 49
Кодировка:      x-Big5-Solaris : 48
Кодировка:      x-euc-jp-linux : 49
Кодировка:            x-EUC-TW : 28
Кодировка:        x-eucJP-Open : 49
Кодировка:           x-IBM1006 : 28
Кодировка:           x-IBM1025 : 28
Кодировка:           x-IBM1046 : 28
Кодировка:           x-IBM1097 : 28
Кодировка:           x-IBM1098 : 28
Кодировка:           x-IBM1112 : 28
Кодировка:           x-IBM1122 : 28
Кодировка:           x-IBM1123 : 28
Кодировка:           x-IBM1124 : 28
Кодировка:           x-IBM1364 : 61
Кодировка:           x-IBM1381 : 49
Кодировка:           x-IBM1383 : 49
Кодировка:          x-IBM33722 : 49
Кодировка:            x-IBM737 : 28
Кодировка:            x-IBM833 : 28
Кодировка:            x-IBM834 : 56
Кодировка:            x-IBM856 : 28
Кодировка:            x-IBM874 : 28
Кодировка:            x-IBM875 : 28
Кодировка:            x-IBM921 : 28
Кодировка:            x-IBM922 : 28
Кодировка:            x-IBM930 : 61
Кодировка:            x-IBM933 : 61
Кодировка:            x-IBM935 : 61
Кодировка:            x-IBM937 : 61
Кодировка:            x-IBM939 : 61
Кодировка:            x-IBM942 : 49
Кодировка:           x-IBM942C : 49
Кодировка:            x-IBM943 : 49
Кодировка:           x-IBM943C : 49
Кодировка:            x-IBM948 : 49
Кодировка:            x-IBM949 : 49
Кодировка:           x-IBM949C : 49
Кодировка:            x-IBM950 : 49
Кодировка:            x-IBM964 : 91
Кодировка:            x-IBM970 : 49
Кодировка:           x-ISCII91 : 28
Кодировка:   x-ISO-2022-CN-CNS : 28
Кодировка:    x-ISO-2022-CN-GB : 65
Кодировка:       x-iso-8859-11 : 28
Кодировка:           x-JIS0208 : 56
Кодировка:     x-JISAutoDetect : Не поддерживается.
Кодировка:             x-Johab : 49
Кодировка:         x-MacArabic : 28
Кодировка:  x-MacCentralEurope : 28
Кодировка:       x-MacCroatian : 28
Кодировка:       x-MacCyrillic : 28
Кодировка:        x-MacDingbat : 28
Кодировка:          x-MacGreek : 28
Кодировка:         x-MacHebrew : 28
Кодировка:        x-MacIceland : 28
Кодировка:          x-MacRoman : 28
Кодировка:        x-MacRomania : 28
Кодировка:         x-MacSymbol : 28
Кодировка:           x-MacThai : 28
Кодировка:        x-MacTurkish : 28
Кодировка:        x-MacUkraine : 28
Кодировка:        x-MS932_0213 : 49
Кодировка:       x-MS950-HKSCS : 49
Кодировка:    x-MS950-HKSCS-XP : 49
Кодировка:         x-mswin-936 : 49
Кодировка:               x-PCK : 49
Кодировка:         x-SJIS_0213 : 49
Кодировка:      x-UTF-16LE-BOM : 58
Кодировка:      X-UTF-32BE-BOM : 116
Кодировка:      X-UTF-32LE-BOM : 116
Кодировка:     x-windows-50220 : 85
Кодировка:     x-windows-50221 : 85
Кодировка:       x-windows-874 : 28
Кодировка:       x-windows-949 : 49
Кодировка:       x-windows-950 : 28
Кодировка: x-windows-iso2022jp : 85
СБОРКА УСПЕШНО ЗАВЕРШЕНА (общее время: 0 секунд)

...
Рейтинг: 0 / 0
Кириллица в 1 байт
    #38367186
Николаха
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
avp.mk,

Что то я не пойму как это должно мне помочь!?
Вот как мне сделать чтобы строка была и длиной 30800 символов и размером 30800 байтов!?

Код: java
1.
s.getBytes("Cp1251")



как я понял это получить массив байтов из строки, где Cp1251 означает, что считываемая строка сейчас в кодировке Cp1251, так!? Или я не правильно думаю!?
...
Рейтинг: 0 / 0
Кириллица в 1 байт
    #38367206
Николаха
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
avp.mk,

getBytes(String charsetName)
Encodes this String into a sequence of bytes using the named charset, storing the result into a new byte array.

т.е наоборот. ))))
...
Рейтинг: 0 / 0
Кириллица в 1 байт
    #38367231
avp.mk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Теперь ещё прочитать что делает getBytes() без параметров.. Будешь совсем молодец))
...
Рейтинг: 0 / 0
Кириллица в 1 байт
    #38367263
am_sasa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Николахаavp.mk,

Код: java
1.
s.getBytes("Cp1251")



как я понял это получить массив байтов из строки, где Cp1251 означает, что считываемая строка сейчас в кодировке Cp1251, так!? Или я не правильно думаю!?
строка это s , как ты ее считал (в какой кодировке) одному богу известно
Cp1251 это кодировка в какой у тебя будут символы содержащиеся в байтах
...
Рейтинг: 0 / 0
Кириллица в 1 байт
    #38367270
JavaSpringFrameworkHibernateGWT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Автору топика явно не помешает изучить основы Java. И вот здесь полазить тоже не помешает:
http://docs.oracle.com/javase/tutorial/i18n/text/convertintro.html

А лучше по всем пройтись:
http://docs.oracle.com/javase/tutorial/
...
Рейтинг: 0 / 0
Кириллица в 1 байт
    #38367314
Николаха
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
am_sasaНиколахаavp.mk,

Код: java
1.
s.getBytes("Cp1251")



как я понял это получить массив байтов из строки, где Cp1251 означает, что считываемая строка сейчас в кодировке Cp1251, так!? Или я не правильно думаю!?
строка это s , как ты ее считал (в какой кодировке) одному богу известно
Cp1251 это кодировка в какой у тебя будут символы содержащиеся в байтах

смотри выше ептить!
...
Рейтинг: 0 / 0
Кириллица в 1 байт
    #38367331
Николаха
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я даже сам её сформировал руками, не считывал ниоткуда!
Код: java
1.
String s="0123456789ААААААААААА                                  БББББББББББББББББ                                  ВВВВВВВВВВВВВВВВВВВВВВ                      ";




авторстрока это s, как ты ее считал (в какой кодировке) одному богу известно
Cp1251 это кодировка в какой у тебя будут символы содержащиеся в байтах
...
Рейтинг: 0 / 0
Кириллица в 1 байт
    #38367401
Озверин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Николаха,

String хранит в себе массив char, char же в свою очередь в java занимает 2 байта. Покажите мануал к вызову
И воообще, длина new String("ABC") <> длине массива этих символов..вообще пичаль
...
Рейтинг: 0 / 0
Кириллица в 1 байт
    #38367425
Озверин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Николаха,

кстати, если вы используете java 6, попробуйте использовать ключ UseCompressedStrings Если я не ошибаюсь, с таким ключом по возможности строки упаковываются из 2х байтовых char в однобайтовые char[]=>byte[]. В java 7 по моему это выпилили.
...
Рейтинг: 0 / 0
Кириллица в 1 байт
    #38367458
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Озверинкстати, если вы используете java 6, попробуйте использовать ключ UseCompressedStrings Если я не ошибаюсь, с таким ключом по возможности строки упаковываются из 2х байтовых char в однобайтовые char[]=>byte[]. В java 7 по моему это выпилили.
Вряд ли это как-то повлияет на интеграцию с нативным кодом.
...
Рейтинг: 0 / 0
Кириллица в 1 байт
    #38367465
Озверин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczОзверинкстати, если вы используете java 6, попробуйте использовать ключ UseCompressedStrings Если я не ошибаюсь, с таким ключом по возможности строки упаковываются из 2х байтовых char в однобайтовые char[]=>byte[]. В java 7 по моему это выпилили.
Вряд ли это как-то повлияет на интеграцию с нативным кодом.

на самом деле есть подозрение, что на вход требуется char[] но как без из с\с++, где в char хранится как раз 1 байт, другими словами, byte[] отлично подойдет ;) Хотя, это всего лишь догадка.
...
Рейтинг: 0 / 0
Кириллица в 1 байт
    #38367478
avp.mk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Озверинкстати, если вы используете java 6, попробуйте использовать ключ UseCompressedStrings Если я не ошибаюсь, с таким ключом по возможности строки упаковываются из 2х байтовых char в однобайтовые char[]=>byte[]. В java 7 по моему это выпилили.
Думаю этот пост поставил рекорд по отдалённости от темы "Вызов нативной функции dll библиотеки со строковым параметром из Java"))
...
Рейтинг: 0 / 0
Кириллица в 1 байт
    #38367483
Озверин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
avp.mkОзверинкстати, если вы используете java 6, попробуйте использовать ключ UseCompressedStrings Если я не ошибаюсь, с таким ключом по возможности строки упаковываются из 2х байтовых char в однобайтовые char[]=>byte[]. В java 7 по моему это выпилили.
Думаю этот пост поставил рекорд по отдалённости от темы "Вызов нативной функции dll библиотеки со строковым параметром из Java"))

учитывая, что стороковый тип в java вообще специфичен только для java, то само название себе противоречит ;) Могли бы с этого начать.
...
Рейтинг: 0 / 0
Кириллица в 1 байт
    #38367486
goalinternet
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Николаха,

Прогоните вашу dll в этой программе и покажите спецификацию метода который нужно вызвать.

DLL Export Viewer v1.62
...
Рейтинг: 0 / 0
Кириллица в 1 байт
    #38367491
avp.mk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Озверинучитывая, что стороковый тип в java вообще специфичен только для java, то само название себе противоречит ;)
В смысле?) String есть только в java вы это имели в виду?))
...
Рейтинг: 0 / 0
25 сообщений из 32, страница 1 из 2
Форумы / Java [игнор отключен] [закрыт для гостей] / Кириллица в 1 байт
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]