今天我醒来后觉得我的代码和我用过的每个图书馆都出现了严重问题,我认为我是对的......(或者请指出我的推理错误的地方)
让我们回到过去十年或者两年,一切都在世界上很好.我跟我的邻居说话,他讲的是同一种语言:只是简单的英语.对我来说,我的邻居和Windows似乎很明显将我们的字符串存储在8位chars中,因为我们使用的所有字符都可以存储在2 ^ 8 = 256种可用组合中.
然后奇迹般的互联网出现了,并允许我与欧洲的一些朋友(他们没有时间学习英语)交谈.这很难用我们的char格式,使用的字符数量很容易超过256,所以在我们完全简单的视觉中我们决定使用16位wchar_ts.称为UCS-2 unicode的东西.它有2 ^ 16 = 65.536种可用组合,对于世界上的每种语言都必须足够!相信我们的正确性,我们甚至还添加了16位的Windows API的W功能,如MessageBoxW和CreateWindowW.我们说服了每个程序员我们的宗教,并且不鼓励使用邪恶的8位对应物(MessageBoxA和CreateWindowA)并通过在我们的构建中定义来MessageBox自动映射调用.因此我们也应该使用函数而不是旧函数(例如,现在应该使用,或者使用自动映射).MessageBoxW_UNICODEwcsstrstrlenwcslen_tcslen
然后事情变得糟糕,事实证明世界上还有其他人使用甚至比我们更怪异的字形(没有冒犯):日本人,中国人等等.它变坏了,因为例如中国人有超过70,000个不同的字符.发生了很多咒骂,给我们留下了一种新型的unicode:UTF-16.它还使用16位数据类型,但某些字符需要两个16位值(称为代理对).这意味着我们不能在这些16位字符串上使用索引(例如,theString [4]可能不会返回第5个字符).为了修补Windows API,决定所有W函数现在应该支持UTF-16格式,这是一个简单的决定,因为所有旧的UCS-2字符串也是有效的UTF-16字符串.但是,因为我们是勇敢的程序员,所以我们现在使用这些wcs功能.遗憾的是,这些功能不具有代理意识,仍然符合UCS-2格式......
与此同时,在一个黑暗的阁楼里,开发了另一种更紧凑的unicode形式:UTF-8.使用8位数据类型,大多数西方语言可以存储在一个8位值中,就像过去一样.当存储更奇特的字形时,使用多个8位值,对于大多数欧洲语言2就足够了.但是,它可能会扩展其中4个值,实质上是创建32位存储类型.就像它的胖兄弟UTF-16一样,我们不能在这些字符串上使用索引.由于它更紧凑的格式,UTF-8现在在互联网上的各个地方广泛使用,因为它节省了带宽.
很好,你是通过我冗长的写作来实现的:)现在我有一些问题/兴趣点:
好的,我对使用UTF-8进行存储非常满意.当我读取一个文件(来自磁盘或HTTP响应)时,我检测到UTF-8签名"\xEF\xBB\xBF"并将内容放在MultiByteToWideChar我的UTF-16字符串中.我可以使用WAPI函数,没问题.但是现在我想修改字符串,替换一些字符等.好的旧wcs函数不再好了,哪些核心字符串函数是UTF-16识别的?还是有一些出色的图书馆,我不知道吗?编辑:似乎ICU是一个非常好的解决方案.我还发现这些wcs函数并不是完全无用的,你可以用来wcsstr搜索,它基本上只是比较wchar_ts.唯一的问题是字符串的长度.
当我们被迫使用16位缺陷W函数时,你是否感觉到了一个丑陋的错误.难道问题不应该在更早的阶段得到认可,并且让所有原始API函数都采用UTF-8字符串并包含适当的字符串操作例程吗?或者这已经是可能的,我可怕的错了吗?编辑:也许这是一个愚蠢的问题,后见之明确实很精彩,现在没有人放下任何人;)
为了快速索引字符,我们应该以32位值存储字符串.这是常见的吗?(我可以听到你的想法:然后我们遇到了一种需要更多组合的外星语言,并且乐趣又重新开始...)这种方法的缺点似乎是我们应该每次将字符串转换回UTF-16我们进行Windows API调用.编辑:引用Alf P. Steinbach 每个指数一个角色是一个绝望的梦想,我现在看到了.我完全错过的一件事是变音符号.我也认为在OS的本机编码中处理是一件好事(对于Windows …
我承认这个问题会有点模糊,但我会尝试通过几个例子来解释我想要完成的事情.我有一些PHP代码从MySQL数据库加载一堆变量,包含一些声明,一些快速输出HTML代码的函数等.但是我希望在将任何内容发送到客户端之前做所有这些事情.
所以我这样做:
<?php
include("somefile.inc");
function bla()
{
...
}
if (fails)
echo "Error: ...<br />";
?>
<!DOCTYPE>
<html>
<head>
<script>
...
<?php echo $someString; ?>
...
</script>
</head>
<body>
...
</body>
</html>
Run Code Online (Sandbox Code Playgroud)
这一切都很好,没问题,直到我收到错误.回声不会在浏览器中显示,因为它在所有HTML之前...所以我修改了:
<!DOCTYPE>
<html>
<head>
<script>
...
<?php echo $someString; ?>
...
</script>
</head>
<body>
<div class="error_block">
<?php
include("somefile.inc");
function bla()
{
...
}
if (fails)
echo "Error: ...<br />";
?>
</div>
...
</body>
</html>
Run Code Online (Sandbox Code Playgroud)
现在我实际上可以看到错误,这很好.但是现在问题出现在标题或者scrips中,我无法访问稍后将在新创建的error_block中加载的变量.
我真的不喜欢将error_clock中的代码拆分为HTML文档上方的某些内容以及error_block中的某些代码.而且我也不想使用PHP的die()函数来完成执行.
任何人都可以在这个问题上给他们2美分?谢谢.
我整个早上一直在摆弄这个,我真的希望有人可以帮助我.我的网站上有一个目录,只有管理员必须能够访问.所以我使用.htaccess文件密码保护它.但我希望index.php仍然可以访问.
所以我尝试过:
AuthUserFile "/home/example.com/passwords/.htpasswd"
AuthType Basic
AuthName "Admin"
require valid-user
<FilesMatch "^index\.php$">
Satisfy Any
Allow from all
</FilesMatch>
Run Code Online (Sandbox Code Playgroud)
是的,它是有效的,但只有在URL中明确指定index.php:
http://www.example.com/admin/index.php - >好的
http://www.example.com/admin/ - > Popup哭着登录
http://www.example.com/admin - > Popup哭着登录
所以我继续修改了正则表达式:
<FilesMatch "^(|index\.php)$">
Satisfy Any
Allow from all
</FilesMatch>
Run Code Online (Sandbox Code Playgroud)
不是我写过的最好的正则表达式但是嘿有一些结果:
http://www.example.com/admin/index.php - >好的
http://www.example.com/admin/ - >好的
http://www.example.com/admin - > Popup哭着登录
我只是不明白为什么这不起作用.我也试过像这样扭转整个事情:
AuthUserFile "/home/example.com/passwords/.htpasswd"
AuthType Basic
AuthName "Admin"
<FilesMatch "^(?!index\.php).+$">
require valid-user
</FilesMatch>
Run Code Online (Sandbox Code Playgroud)
但又无济于事......任何人都能看到解决方案?
我刚刚在Win32 C++中开始使用OpenGL编程,所以对我来说不要太难:)我现在一直在徘徊NeHe教程和"红皮书",但我很困惑.到目前为止,我已经能够设置一个OpenGL窗口,绘制一些三角形等,没问题.但是现在我想建立一个模型并从不同角度查看它.我们也是:
将模型加载到内存中(在堆上的结构中保存三角形/四边形坐标),在每个场景渲染中,我们使用所有东西绘制到屏幕上glVertex3f,依此类推.
使用glVertex3f等加载/绘制模型一次,我们只需更改每个场景中的查看位置即可.
其他...?
在我看来,从我到目前为止阅读的所有内容来看,选项1是最合理的,但它似乎有点呃......愚蠢!我们必须决定哪些对象是可见的,并且只绘制那些对象.这不是很慢吗?选项2可能看起来更有吸引力:)
编辑:感谢所有帮助,我决定做的事:从文件中读取我的模型,然后将其加载到使用GPU的内存glBufferData,然后使用数据反馈到渲染功能glVertexPointer和glDrawArrays.