Portal > Foren > PHP > PHP-Programmierung > String-Größe (nicht Länge)
Antwort
 
Themen-Optionen Thema durchsuchen
Alt 04.10.2005, 22:12 Nach oben    #1
me pro ok?
 
Benutzerbild von Lars
 
Registriert seit: 07.09.2005
Ort: Pulheim bei Köln
Beiträge: 964
Standard String-Größe (nicht Länge)

// Edit:
Okay, hat sich gerade eben erledigt. Sachen erledigen sich immer von selbst, wenn ich gerade gepostet hab :>


Ich möchte die mir die Größe eines Strings berechnen lassen.
Als ersten Lösungsansatz hab ich mir da ausgedacht, zu schauen, wieviele Bytes die einzelnen Zeichen im jeweiligen Zeichensatz haben und das dann zusammenzurechnen.
Da gibts dann aber ein Problem. Woran erkenne ich, welcher Zeichensatz denn gerade verwendet wird. Der String wird höchstwahrscheinlich dynamisch kommen, also kann da prinzipiell alles drinstecken.

Verwendet PHP UTF-8 als Standard-Zeichensatz?
__________________
Gedanken aus Draht stricken einen Zaun.

Geändert von Lars (04.10.2005 um 22:16 Uhr)
Lars ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 04.10.2005, 22:33 Nach oben    #2
me pro ok?
 
Benutzerbild von Lars
 
Registriert seit: 07.09.2005
Ort: Pulheim bei Köln
Beiträge: 964
Standard

Okay, neues Problem

Ich bin jetzt inzwischen an der Stelle angelangt, an der ich den String zu UTF-8 konvertiere. Aber UTF-8 Zeichen haben eine variable Größe von 1 bis maximal 4 Bytes. Jemand ne Idee, wie ich darauf reagieren könnte?
__________________
Gedanken aus Draht stricken einen Zaun.
Lars ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 04.10.2005, 23:12 Nach oben    #3
Benjamin Steininger
 
Benutzerbild von robo47
 
Registriert seit: 02.06.2005
Ort: weiher im tiefsten Odenwald
Beiträge: 1.203
Standard

http://www.php.net/manual/en/ref.mbstring.php
alles multibyte funktionen unter anderem mb_strlen
http://www.php.net/manual/en/function.mb-strlen.php

denke das ist was du suchst oder?

mfg
robo47
robo47 ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 05.10.2005, 22:53 Nach oben    #4
me pro ok?
 
Benutzerbild von Lars
 
Registriert seit: 07.09.2005
Ort: Pulheim bei Köln
Beiträge: 964
Standard

Das hatte ich mir auch schon angeschaut, aber mb_strlen() hat ja nur den Vorteil, dass ein MB-Char wirklich als _ein_ Zeichen gezählt wird. Es kann mir aber nicht sagen, wie viel Byte die einzelnen Zeichen brauchen.
__________________
Gedanken aus Draht stricken einen Zaun.
Lars ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 05.10.2005, 23:04 Nach oben    #5
Benjamin Steininger
 
Benutzerbild von robo47
 
Registriert seit: 02.06.2005
Ort: weiher im tiefsten Odenwald
Beiträge: 1.203
Standard

öhm die bytes währen doch imho

strlen($string) +1, das eine für die info über die länge des strings (soweit sich da ein string in pascal von php unterscheidet, aber mir fällt auch gerade ein, dass in pascal

string[0] die länge war und in pascal gings ja auch nur bis 255 zeichen.

mfg
robo47
robo47 ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 05.10.2005, 23:15 Nach oben    #6
me pro ok?
 
Benutzerbild von Lars
 
Registriert seit: 07.09.2005
Ort: Pulheim bei Köln
Beiträge: 964
Standard

Wikipedia sagt z. B. zu UTF-8:
Zitat:
UTF-8 unterstützt bis zu 4 Byte
Und das ist eben das Problem. Wäre die Bytezahl pro Zeichen konstant, könnte ich einfach $size = mb_strlen($string)*4 machen.
__________________
Gedanken aus Draht stricken einen Zaun.
Lars ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 05.10.2005, 23:21 Nach oben    #7
Benjamin Steininger
 
Benutzerbild von robo47
 
Registriert seit: 02.06.2005
Ort: weiher im tiefsten Odenwald
Beiträge: 1.203
Standard

aber ein utf-8-string den du anstatt mit mb_strlen mittels strlen überprüfst, sollte doch dann die anzahl der bytes ausspucken oder ?

zuzügl dem byte für die längenangabe, hast du dann deine größeninfo
robo47 ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 05.10.2005, 23:25 Nach oben    #8
me pro ok?
 
Benutzerbild von Lars
 
Registriert seit: 07.09.2005
Ort: Pulheim bei Köln
Beiträge: 964
Standard

Hau mich, wenn ich falsch liege, aber strlen() gibt doch die Anzahl der Zeichen zurück?
Das ist ja schön und gut, aber da ich nicht weiß, wieviele Byte ein Zeichen genau nimmt, bringt mir das nichts

Eine Möglichkeit wäre vielleicht, jedes Zeichen einzeln zu untersuchen. Aber das dürfte bei ganzen HTML-Dokumenten zu lange dauern.
__________________
Gedanken aus Draht stricken einen Zaun.
Lars ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 05.10.2005, 23:31 Nach oben    #9
Benjamin Steininger
 
Benutzerbild von robo47
 
Registriert seit: 02.06.2005
Ort: weiher im tiefsten Odenwald
Beiträge: 1.203
Standard

öhm sofern du irgendeinen string in utf-8 umwandelst, sollte strlen dir die anzahl der bytes ausgeben, ich mein ich bin mir nichtsicher, aber soweit sich mir das ergibt von der logik her sollte es so sein und wenn du mal testweise einen utf-8 string ausgibst ohne passenden header, siehst du ja auch dass mehr "zeichen" daraus werden.

also sollte doch die strlen, dann mehr oder minder die anzahl der bytes sein.

mfg
robo47
robo47 ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 06.10.2005, 08:08 Nach oben    #10
Benutzer
 
Benutzerbild von Guradia
 
Registriert seit: 18.08.2005
Ort: Düsseldorf
Beiträge: 57
Standard

@Lars ... schon witzig... du machst hier einen etwas verwirrten Eindruck ^^

Erste Sache: Wie auf die 1-6(!) Byte reagieren?
Meine Gedanke: Warum überhaupt reagieren?

Zweite Sache: Du willst Bytes haben, keine Zeichen
Mein Gedanke: Warum dann überhaupt erst Zeichen zählen mit mb_*? Es gibt doch einen seeehr exakten Grund warum du dir denkst, das strlen() nicht funktioniert beim Zeichen-Zählen. Ebend weil es tatsächlchen nur Bytes zählt ^^
Guradia ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 06.10.2005, 12:28 Nach oben    #11
me pro ok?
 
Benutzerbild von Lars
 
Registriert seit: 07.09.2005
Ort: Pulheim bei Köln
Beiträge: 964
Standard

Ich bin gerade auch ein wenig verwirrt :>

Ich mb_strlen() gerade mal mit ein paar UTF-8 Zeichen von http://www.columbia.edu/kermit/utf8.html getestet.
Code:
¥ · £ · € · $ · ¢ · ₡ · ₢ · ₣ · ₤ · ₥ · ₦ · ₧ · ₨ · ₩ · ₪ · ₫ · ₭ · ₮ · ₯
Ich habs mal nachgezählt, es sind mit Leerzeichen exakt 75 Zeichen im String un mb_strlen gibt mir das auch zurück.

Jetzt bin ich ein wenig sehr verwirrt.


// Edit:
strlen() gbt das selbe zurück.
__________________
Gedanken aus Draht stricken einen Zaun.
Lars ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 06.10.2005, 19:12 Nach oben    #12
Waq
Erfahrener Benutzer
 
Registriert seit: 18.08.2005
Beiträge: 108
Standard

PHP-Code:
<?php
$str
="₦ · ₭";
echo 
$str."\n"
echo 
strlen($str)."\n"//ergibt 10 bytes 
echo mb_strlen($str,"UTF-8")."\n"//ergibt 5 Zeichen 
?>
Ne Autodetection, welcher Zeichensatz verwendet wird, kannst wohl vergessen. Wenn Du nicht weisst, um welchen Zeichensatz es sich handelt... Pech gehabt. Es gibt zwar mb_detect_encoding(), aber so richtig zuverlässig kann sowas nie sein.

Geändert von Waq (06.10.2005 um 19:21 Uhr)
Waq ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 06.10.2005, 19:18 Nach oben    #13
Waq
Erfahrener Benutzer
 
Registriert seit: 18.08.2005
Beiträge: 108
Standard

Zitat:
Zitat von robo47
strlen($string) +1
Also erstmal wären es wohl strlen()+sizeof(long integer), also auf 32bit-Systemen strlen()+4, bei 64bit +8;

Als zweites schickt sich aber die Frage an, warum Du die Metadaten da mit reinziehst? Solltest Du dann nicht gleich noch den Speicherverbrauch des Hashtable-Eintrages mitberechnen?
Waq ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Antwort

Lesezeichen


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks sind an
PingBacks sind an
RefBacks sind aus

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Problem bei Verarbeitung von Templates (Eigene Klassen) dago PHP-Programmierung 21 31.08.2006 16:02
Symbolklassen festlegen anna Allgemeine Java-Programmierung 2 12.11.2005 11:30
Datei einlesen. cyberdevil87 Allgemeine Java-Programmierung 3 27.06.2005 09:22
Access Anbindung unter Linux mit Java ? kampet Datenbanken 5 25.04.2005 08:43
string in teilbereiche zerteilen!? Niki_Tesla Allgemeine Java-Programmierung 10 14.02.2005 09:11


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:24 Uhr.


Powered by vBulletin® Version 3.7.4 (Deutsch)
Copyright ©2000 - 2008, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0

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